1 //========================================================================
5 // Portable mutex macros.
7 // Copyright 2002-2003 Glyph & Cog, LLC
9 //========================================================================
20 // ... critical section ...
29 typedef CRITICAL_SECTION GooMutex
;
31 #define gInitMutex(m) InitializeCriticalSection(m)
32 #define gInitMutexReentrant(m) InitializeCriticalSection(m)
33 #define gDestroyMutex(m) DeleteCriticalSection(m)
34 #define gLockMutex(m) EnterCriticalSection(m)
35 #define gUnlockMutex(m) LeaveCriticalSection(m)
37 #else // assume pthreads
41 typedef pthread_mutex_t GooMutex
;
43 #define gInitMutex(m) pthread_mutex_init(m, NULL)
44 #define gDestroyMutex(m) pthread_mutex_destroy(m)
45 #define gLockMutex(m) pthread_mutex_lock(m)
46 #define gUnlockMutex(m) pthread_mutex_unlock(m)
48 #define gInitMutexReentrant(m) \
50 pthread_mutexattr_t attr; \
51 pthread_mutexattr_init(&attr); \
52 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP); \
53 pthread_mutex_init(mutex, &attr); \
57 class MutexAutoInitDestroy
{
59 MutexAutoInitDestroy(GooMutex
*mutex
) {
61 gInitMutexReentrant(mMutex
);
63 ~MutexAutoInitDestroy() {
64 gDestroyMutex(mMutex
);