(file) Return to lockposix.h CVS log (file) (dir) Up to [OMI] / omi / pal

  1 krisbash 1.1 #ifndef _pal_lockposix_h
  2              #define _pal_lockposix_h
  3              
  4              #if !defined(_pal_lock_h)
  5              #error "Include pal/lock.h (Atomic version available)"
  6              #endif
  7              
  8              #include "palcommon.h"
  9              #include "thread.h"
 10              #include <pthread.h>
 11              
 12              PAL_BEGIN_EXTERNC
 13              
 14              /*
 15              **==============================================================================
 16              **
 17              ** ReadWriteLock -- read/write lock (non-recursive)
 18              **
 19              **==============================================================================
 20              */
 21              
 22 krisbash 1.1 #define READWRITELOCK_INITIALIZER PTHREAD_RWLOCK_INITIALIZER
 23              
 24              typedef struct _ReadWriteLock
 25              {
 26                  pthread_rwlock_t lock;
 27              } 
 28              ReadWriteLock;
 29              
 30              PAL_INLINE void ReadWriteLock_Init(_Out_ ReadWriteLock* self)
 31              {
 32                  pthread_rwlock_t tmp = PTHREAD_RWLOCK_INITIALIZER;
 33                  memcpy(&self->lock, &tmp, sizeof(tmp));
 34              }
 35              
 36              PAL_INLINE void ReadWriteLock_AcquireRead(
 37                  _Inout_ ReadWriteLock* self)
 38              {
 39                  pthread_rwlock_rdlock(&self->lock);
 40              }
 41              
 42              PAL_INLINE int ReadWriteLock_TryAcquireRead(
 43 krisbash 1.1     _Inout_ ReadWriteLock* self)
 44              {
 45                  return pthread_rwlock_tryrdlock(&self->lock) == 0 ? 1 : 0;
 46              }
 47              
 48              PAL_INLINE void ReadWriteLock_AcquireWrite(
 49                  _Inout_ ReadWriteLock* self)
 50              {
 51                  pthread_rwlock_wrlock(&self->lock);
 52              }
 53              
 54              PAL_INLINE int ReadWriteLock_TryAcquireWrite(
 55                  _Inout_ ReadWriteLock* self)
 56              {
 57                  return pthread_rwlock_trywrlock(&self->lock) == 0 ? 1 : 0;
 58              }
 59              
 60              PAL_INLINE void ReadWriteLock_ReleaseRead(
 61                  _Inout_ ReadWriteLock* self)
 62              {
 63                  pthread_rwlock_unlock(&self->lock);
 64 krisbash 1.1 }
 65              
 66              PAL_INLINE void ReadWriteLock_ReleaseWrite(
 67                  _Inout_ ReadWriteLock* self)
 68              {
 69                  pthread_rwlock_unlock(&self->lock);
 70              }
 71              
 72              /*
 73              **==============================================================================
 74              **
 75              ** Lock -- simple non-recursive lock
 76              **
 77              **==============================================================================
 78              */
 79              
 80              #define LOCK_INITIALIZER { PTHREAD_MUTEX_INITIALIZER }
 81              
 82              typedef struct _Lock
 83              {
 84                  pthread_mutex_t lock;
 85 krisbash 1.1 } Lock;
 86              
 87              PAL_INLINE void Lock_Init(
 88                  _Out_ Lock* self)
 89              {
 90                  pthread_mutex_t tmp = PTHREAD_MUTEX_INITIALIZER;
 91                  memcpy(&self->lock, &tmp, sizeof(tmp));
 92              }
 93              
 94              PAL_INLINE void Lock_Acquire(
 95                  _Inout_ Lock* self)
 96              {
 97                  pthread_mutex_lock(&self->lock);
 98              }
 99              
100              PAL_INLINE int Lock_TryAcquire(
101                  _Inout_ Lock* self)
102              {
103                  return pthread_mutex_trylock(&self->lock) == 0 ? 1 : 0;
104              }
105              
106 krisbash 1.1 PAL_INLINE void Lock_Release(
107                  _Inout_ Lock* self)
108              {
109                  pthread_mutex_unlock(&self->lock);
110              }
111              
112              /*
113              **==============================================================================
114              **
115              ** RecursiveLock -- recursive lock
116              **
117              **==============================================================================
118              */
119              
120              #define RECURSIVELOCK_INITIALIZER {LOCK_INITIALIZER, 0}
121              
122              typedef struct _RecursiveLock
123              {
124                  Lock lock;
125                  ptrdiff_t count;
126                  ThreadID owner;
127 krisbash 1.1 } RecursiveLock;
128              
129              PAL_INLINE void RecursiveLock_Init(
130                  _Out_ RecursiveLock* self)
131              {
132                  Lock_Init(&self->lock);
133                  self->count = 0;
134                  self->owner = Thread_ID_Null();
135              }
136              
137              void RecursiveLock_Acquire(
138                  _Inout_ RecursiveLock* self);
139              
140              PAL_INLINE void RecursiveLock_Release(
141                  _Inout_ RecursiveLock* self)
142              {
143                  if (--self->count > 0)
144                      return;
145              
146                  self->owner = Thread_ID_Null();
147                  Lock_Release(&self->lock);
148 krisbash 1.1 }
149              
150              /*
151              **==============================================================================
152              **
153              ** CachedLock -- cached lock
154              **
155              **==============================================================================
156              */
157              
158              typedef ReadWriteLock CachedLock;
159              
160              #define CACHEDLOCK_FLAG_SHARED (1 << 0)
161              
162              _Return_type_success_(return == 0) 
163              PAL_INLINE int CachedLock_Init(
164                  _Out_ CachedLock* self,
165                  unsigned long flags)
166              { 
167                  ReadWriteLock_Init(self); 
168                  return 0; 
169 krisbash 1.1 }
170              
171              #define CachedLock_Destroy(self) 
172              
173              #define CachedLock_AcquireRead(self, token) ReadWriteLock_AcquireRead(self)
174              
175              #define CachedLock_AcquireWrite(self) ReadWriteLock_AcquireWrite(self)
176              
177              #define CachedLock_ReleaseRead(self, token) ReadWriteLock_ReleaseRead(self)
178              
179              #define CachedLock_ReleaseWrite(self) ReadWriteLock_ReleaseWrite(self)
180              
181              /*
182              **==============================================================================
183              **
184              ** CondLock -- condition variable
185              **
186              **==============================================================================
187              */
188              
189              #define CONDLOCK_DEFAULT_SPINCOUNT ((size_t)-1)
190 krisbash 1.1 #define CONDLOCK_HIGH_SPINCOUNT    ((size_t)-2)
191              #define CONDLOCK_LOW_SPINCOUNT     ((size_t)-3)
192              
193              int CondLock_Wait(
194                  ptrdiff_t key,
195                  _In_ volatile const ptrdiff_t* destination,
196                  ptrdiff_t comparand,
197                  size_t spinCount);
198              
199              void CondLock_Broadcast(
200                  ptrdiff_t key);
201              
202              void CondLock_BroadcastSpinners(
203                  ptrdiff_t key);
204              
205              void CondLock_Signal(
206                  ptrdiff_t key);
207              
208              PAL_END_EXTERNC
209              
210              #endif /* _pal_lockposix_h */

ViewCVS 0.9.2