ifIndexLib.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:4k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* ifIndexLib.c - interface index library */
  2. /* Copyright 1984 - 2000 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01b,11jul01,jpf  Fixed a problem with the init routine resetting the index
  8. 01a,29mar01,spm  file creation: copied from version 01b 0f tor2_0.open_stack
  9.                  branch (wpwr VOB) for unified code base
  10. */
  11. /*
  12. DESCRIPTION
  13. This library allocates unique interface indexes.  Indexes start from  
  14. 1 and increase monotonically.  
  15. ifIndexLibInit() must be called before any other functions.
  16. ifIndexAlloc() and ifIndexTest() are reentrant,
  17. ifIndexLibInit() and ifIndexLibShutdown() are not.
  18. INCLUDE FILES: ifIndexLib.h
  19. .pG "Network"
  20. NOMANUAL
  21. */
  22. /* includes */
  23. #include "vxWorks.h"
  24. #include "semLib.h"
  25. #include "ifIndexLib.h"
  26. /* externs */
  27. /* globals */
  28. /* defines */
  29. /* typedefs */
  30. /* locals */
  31. LOCAL int ifIndexValue = 0;     /* 0 = uninitialized, -1 = overflowed, other = OK */
  32. LOCAL SEM_ID ifIndexSem;
  33. /* forward declarations */
  34. /***************************************************************************
  35. *
  36. * ifIndexLibInit - initializes library variables
  37. *
  38. * ifIndexLibInit() resets library internal state.  This function must be called
  39. * before any other functions in this library.
  40. *
  41. * RETURNS: N/A
  42. */
  43. void ifIndexLibInit (void)
  44.     {
  45.     if (ifIndexValue == 0)
  46.         {
  47.         /* library uninitialized */
  48.         ifIndexSem = semMCreate(SEM_Q_PRIORITY | SEM_INVERSION_SAFE);
  49.         ifIndexValue = 1;
  50.         }
  51.     }
  52.     
  53. /***************************************************************************
  54. *
  55. * ifIndexLibShutdown - frees library variables
  56. *
  57. * ifIndexLibShutdown() frees library internal structures.  
  58. * ifIndexLibInit() must be called before the library can be used again.
  59. *
  60. * RETURNS: N/A
  61. */
  62. void ifIndexLibShutdown (void)
  63.     {
  64.     if (ifIndexValue != 0)
  65.         {
  66.         /* library initialized */
  67.         semTake(ifIndexSem, WAIT_FOREVER);
  68.         ifIndexValue = 0;
  69.         semDelete(ifIndexSem);
  70.         }
  71.     /* else do nothing */
  72.     }
  73. /***************************************************************************
  74. *
  75. * ifIndexAlloc - return a unique interface index
  76. *
  77. * ifIndexAlloc() returns a unique integer to be used as an interface
  78. * index.  The first index returned is 1.  ERROR is returned if the library
  79. * has not been initialized by a call to ifIndexLibInit();
  80. *
  81. * RETURNS: interface index or ERROR
  82. */
  83. int ifIndexAlloc (void)
  84.     {
  85.     int ret;
  86.     if (ifIndexValue == 0)
  87.         {
  88.         /* library not initialized */
  89.         return ERROR;
  90.         }
  91.     semTake(ifIndexSem, WAIT_FOREVER);
  92.     if (ifIndexValue == -1)
  93.         {
  94.         /* overflow after 4 billion allocs */
  95.         semGive(ifIndexSem);
  96.         return ERROR;
  97.         }
  98.     ret = ifIndexValue++;
  99.     semGive(ifIndexSem);
  100.     return ret;
  101.     }
  102. /***************************************************************************
  103. *
  104. * ifIndexTest - returns true if an index has been allocated.
  105. *
  106. * ifIndexTest() returns TRUE if <index> has already been allocated by
  107. * ifIndexLibAlloc().  Otherwise returns FALSE.  If the library has not
  108. * been initialized returns FALSE.  This function does not check if the
  109. * index actually belongs to a currently valid interface.
  110. *
  111. * RETURNS: TRUE or FALSE
  112. */
  113. BOOL ifIndexTest
  114.     (
  115.     int ifIndex    /* the index to test */
  116.     )
  117.     {
  118.     if (ifIndex == -1 || ifIndex == 0)
  119.         {
  120.         /* these values are never valid */
  121.         return FALSE;
  122.         }
  123.     semTake(ifIndexSem, WAIT_FOREVER);
  124.     if ((unsigned int)ifIndex < (unsigned int)ifIndexValue)
  125.         {
  126.         semGive(ifIndexSem);
  127.         return TRUE;
  128.         }
  129.     semGive(ifIndexSem);
  130.     return FALSE;
  131.     }