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

VxWorks

开发平台:

C/C++

  1. /* semOLib.c - release 4.x binary semaphore library */
  2. /* Copyright 1984-1998 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01v,09nov01,dee  add CPU_FAMILY != COLDFIRE in portable test
  8. 01u,04sep98,cdp  make ARM CPUs with ARM_THUMB==TRUE use portable routines.
  9. 01u,03mar00,zl   merged SH support into T2
  10. 01t,17feb98,cdp  added ARM to list of optimised CPUs.
  11. 01s,19mar95,dvs  removed tron references.
  12. 01r,09jun93,hdn  added a support for I80X86
  13. 01q,20jan93,jdi  documentation cleanup for 5.1.
  14. 01p,28jul92,jcf  semO{Create,Init} call semOLibInit for robustness.
  15. 01o,06jul92,kdl  fixed semOLibInit() to use correct table offset (SEM_TYPE_OLD).
  16. 01n,04jul92,jcf  added semOLibInit() to fill in semLib tables.
  17. 01m,15jun92,jcf  scalability addressed.
  18. 01l,26may92,rrr  the tree shuffle
  19. 01k,15sep91,ajm  added MIPS to list of optimized CPU's
  20. 01j,04oct91,rrr  passed through the ansification filter
  21.                   -changed functions to ansi style
  22.   -fixed #else and #endif
  23.   -changed copyright notice
  24. 01i,26sep91,hdn  added conditional flag for TRON optimized code.
  25. 01h,05apr91,jdi  documentation -- removed header parens and x-ref numbers;
  26.  doc review by jcf.
  27. 01g,24mar91,jdi  documentation cleanup.
  28. 01f,28sep90,jcf  documentation.
  29. 01e,03aug90,jcf  documentation.
  30. 01d,05jul90,jcf  optimized version now available.
  31. 01c,26jun90,jcf  merged into one semaphore class.
  32.  fixed stack usagae error in semClear.
  33. 01b,10may90,jcf  fixed optimized version of semClear.
  34. 01a,20oct89,jcf  written based on v1g of semLib.
  35. */
  36. /*
  37. DESCRIPTION
  38. This library is provided for backward compatibility with VxWorks 
  39. 4.x semaphores.  The semaphores are identical to 5.0 
  40. binary semaphores, except that timeouts -- missing or specified -- 
  41. are ignored.
  42. For backward compatibility, semCreate() operates as before, allocating and
  43. initializing a 4.x-style semaphore.  Likewise, semClear() has been implemented
  44. as a semTake(), with a timeout of NO_WAIT.
  45. For more information on of the behavior of binary semaphores, see
  46. the manual entry for semBLib.
  47. INCLUDE FILES: semLib.h
  48. SEE ALSO: semLib, semBLib,
  49. .pG "Basic OS"
  50. */
  51. #include "vxWorks.h"
  52. #include "private/objLibP.h"
  53. #include "private/semLibP.h"
  54. #include "private/windLibP.h"
  55. /* optimized version available for 680X0, MIPS, i86, SH, */
  56. /* COLDFIRE and ARM (excluding Thumb) */
  57. #if (defined(PORTABLE) || 
  58.      ((CPU_FAMILY != MC680X0) && 
  59.       (CPU_FAMILY != MIPS) && 
  60.       (CPU_FAMILY != I80X86) && 
  61.       (CPU_FAMILY != SH) && 
  62.       (CPU_FAMILY != COLDFIRE) && 
  63.       (CPU_FAMILY != ARM)) || 
  64.      ((CPU_FAMILY == ARM) && ARM_THUMB))
  65. #define semOLib_PORTABLE
  66. #endif
  67. /* locals */
  68. LOCAL BOOL semOLibInstalled; /* protect from muliple inits */
  69. /*******************************************************************************
  70. *
  71. * semOLibInit - initialize the old sytle semaphore management package
  72. * SEE ALSO: semLibInit(1).
  73. * NOMANUAL
  74. */
  75. STATUS semOLibInit (void)
  76.     {
  77.     if (!semOLibInstalled)
  78. {
  79. semGiveTbl [SEM_TYPE_OLD] = (FUNCPTR) semBGive;
  80. semTakeTbl [SEM_TYPE_OLD] = (FUNCPTR) semOTake;
  81. semFlushTbl [SEM_TYPE_OLD] = (FUNCPTR) semQFlush;
  82. semGiveDeferTbl [SEM_TYPE_OLD] = (FUNCPTR) semBGiveDefer;
  83. semFlushDeferTbl [SEM_TYPE_OLD] = (FUNCPTR) semQFlushDefer;
  84. if (semLibInit () == OK)
  85.     semOLibInstalled = TRUE;
  86. }
  87.     return ((semOLibInstalled) ? OK : ERROR);
  88.     }
  89. /*******************************************************************************
  90. *
  91. * semCreate - create and initialize a release 4.x binary semaphore
  92. *
  93. * This routine allocates a VxWorks 4.x binary semaphore.  The semaphore is
  94. * initialized to empty.  After initialization, it must be given before it
  95. * can be taken.
  96. *
  97. * RETURNS: The semaphore ID, or NULL if memory cannot be allocated.
  98. *
  99. * SEE ALSO: semInit()
  100. */
  101. SEM_ID semCreate (void)
  102.     {
  103.     SEM_ID semId; 
  104.     if ((!semOLibInstalled) && (semOLibInit () != OK)) /* initialize package */
  105. return (NULL);
  106.     if ((semId = semBCreate (SEM_Q_PRIORITY, SEM_EMPTY)) != NULL)
  107. semId->semType = SEM_TYPE_OLD; /* change type to OLD */
  108.     return (semId);
  109.     }
  110. /******************************************************************************
  111. *
  112. * semInit - initialize a static binary semaphore
  113. *
  114. * This routine initializes static VxWorks 4.x semaphores.  In some
  115. * instances, a semaphore cannot be created with semCreate() but is a static
  116. * object.
  117. *
  118. * RETURNS: OK, or ERROR if the semaphore cannot be initialized.
  119. *
  120. * SEE ALSO: semCreate()
  121. */
  122. STATUS semInit
  123.     (
  124.     SEMAPHORE *pSemaphore       /* 4.x semaphore to initialize */
  125.     )
  126.     {
  127.     if ((!semOLibInstalled) && (semOLibInit () != OK)) /* initialize package */
  128. return (ERROR);
  129.     if (semBInit (pSemaphore, SEM_Q_PRIORITY, SEM_EMPTY) != OK)
  130. return (ERROR);
  131.     pSemaphore->semType = SEM_TYPE_OLD;
  132.     return (OK);
  133.     }
  134. #ifdef semOLib_PORTABLE
  135. /*******************************************************************************
  136. *
  137. * semOTake - take semaphore
  138. *
  139. * Takes the semaphore.  If the semaphore is empty (it has not been given
  140. * since the last semTake or semInit), this task will become pended until
  141. * the semaphore becomes available by some other task doing a semGive()
  142. * of it.  If the semaphore is already available, this call will empty
  143. * the semaphore, so that no other task can take it until this task gives
  144. * it back, and this task will continue running.
  145. *
  146. * WARNING
  147. * This routine may not be used from interrupt level.
  148. *
  149. * NOMANUAL
  150. */
  151. STATUS semOTake
  152.     (
  153.     SEM_ID semId        /* semaphore ID to take */
  154.     )
  155.     {
  156.     return (semBTake (semId, WAIT_FOREVER));
  157.     }
  158. /******************************************************************************
  159. *
  160. * semClear - take a release 4.x semaphore, if the semaphore is available
  161. *
  162. * This routine takes a VxWorks 4.x semaphore if it is available (full), 
  163. * otherwise no action is taken except to return ERROR.  This routine never 
  164. * preempts the caller.
  165. *
  166. * RETURNS: OK, or ERROR if the semaphore is unavailable.
  167. */
  168. STATUS semClear
  169.     (
  170.     SEM_ID semId        /* semaphore ID to empty */
  171.     )
  172.     {
  173.     return (semBTake (semId, NO_WAIT));
  174.     }
  175. #endif /* semOLib_PORTABLE */