vxwMutex.h
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:3k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* vxwMutex.h - simple locking macros for multithread safe iostreams and STL*/
  2. /* Copyright 1998 Wind River Systems, Inc. */
  3. /* 
  4. modification history
  5. --------------------
  6. 01i,16jun01,yvp use brackets with "extern C++" to avoid compiler error.
  7. 01h,09nov99,sn  prevent locks from being destroyed twice
  8. 01g,25feb99,sn  wrap the struct defn in extern "C++"
  9. 01f,24feb99,sn  make sure sem is initialized to zero
  10. 01e,09nov98,sn  ensure that initialization occurs whether we use
  11.                 the macros (C) or the methods (C++)
  12. 01d,29oct98,sn  lazily initialize locks on first use
  13. 01c,04sep98,sn  added void return type to lock and unlock methods 
  14. 01b,01sep98,sn  vxw_mutex_... macros are now defined for both C and C++
  15. 01a,01may98,sn wrote
  16. */
  17. #ifndef __INCvxwMutexh
  18. #define __INCvxwMutexh
  19. #include <semLib.h>
  20. #ifdef __cplusplus
  21. extern "C" {
  22. #endif
  23. /* There are C files that include this header. We must set everything
  24.  * up so that vxw_mutex_t looks like an ordinary struct if
  25.  * we're compiling C and a full blown class if its C++.
  26.  */
  27. /* The following macros take the place of member functions in C code
  28.  */
  29. #define vxw_mutex_init(_name) (_name).sem = semMCreate (SEM_Q_PRIORITY | 
  30.                                                 SEM_DELETE_SAFE | 
  31.                                                 SEM_INVERSION_SAFE)
  32.   /*
  33.    * Apparently the iostreams code will sometimes destroy a lock
  34.    * explicitly (via vxw_mutex_fini) and implictly (through the
  35.    * vxw_mutex destructor). We ensure deletion is only performed
  36.    * once.
  37.    */
  38. #define vxw_mutex_fini(_name) do 
  39.     { 
  40.         if ((_name).sem != 0) 
  41.             { 
  42.             semTake ((_name).sem, WAIT_FOREVER); 
  43.             semDelete ((_name).sem); 
  44.             (_name).sem = 0 ; 
  45.             } 
  46.     } while (0)
  47. #define vxw_mutex_lock(_name) do 
  48.         { 
  49. /* initialize on first use: this works around a compiler bug that 
  50.          * may allow a global lock to be taken before its constructor is 
  51.          * called ... */ 
  52.         if ((_name).sem == 0) 
  53.             { 
  54.             vxw_mutex_init(_name); 
  55.             } 
  56.         semTake ((_name).sem, WAIT_FOREVER); 
  57. } while (0)
  58. #define vxw_mutex_unlock(_name) do 
  59.         { 
  60.         if ((_name).sem == 0) 
  61.             { 
  62.             vxw_mutex_init(_name); 
  63.             } 
  64.         semGive ((_name).sem); 
  65. } while (0)
  66. #ifdef __cplusplus
  67. extern "C++" {
  68. #endif
  69. struct vxw_mutex_t
  70.     {
  71.     SEM_ID sem;
  72. #ifdef __cplusplus
  73.     vxw_mutex_t () : sem (0) {/* NO-OP for now*/}
  74.     ~vxw_mutex_t () {vxw_mutex_fini(*this);}
  75.     void lock () {vxw_mutex_lock(*this);}
  76.     void unlock () {vxw_mutex_unlock(*this);}
  77. #endif
  78.     };
  79. #ifdef __cplusplus
  80. }
  81. }
  82. #endif
  83. #endif /* __INCvxwMutexh */