00001
00049 #pragma once
00050 #ifndef VHACD_MUTEX_H
00051 #define VHACD_MUTEX_H
00052
00053 #if defined(WIN32)
00054
00055 #ifndef _WIN32_WINNT
00056 #define _WIN32_WINNT 0x400
00057 #endif
00058 #include <windows.h>
00059 #pragma comment(lib, "winmm.lib")
00060 #endif
00061
00062 #if defined(__linux__)
00063
00064 #include <errno.h>
00065 #include <time.h>
00066 #include <unistd.h>
00067 #define __stdcall
00068 #endif
00069
00070 #if defined(__APPLE__) || defined(__linux__)
00071 #include <pthread.h>
00072 #endif
00073
00074 #if defined(__APPLE__)
00075 #define PTHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE
00076 #endif
00077
00078 #define VHACD_DEBUG
00079
00080
00081 #ifdef VHACD_NDEBUG
00082 #define VHACD_VERIFY(x) (x)
00083 #else
00084 #define VHACD_VERIFY(x) assert((x))
00085 #endif
00086
00087 namespace VHACD {
00088 class Mutex {
00089 public:
00090 Mutex(void)
00091 {
00092 #if defined(WIN32) || defined(_XBOX)
00093 InitializeCriticalSection(&m_mutex);
00094 #elif defined(__APPLE__) || defined(__linux__)
00095 pthread_mutexattr_t mutexAttr;
00096 VHACD_VERIFY(pthread_mutexattr_init(&mutexAttr) == 0);
00097 VHACD_VERIFY(pthread_mutexattr_settype(&mutexAttr, PTHREAD_MUTEX_RECURSIVE_NP) == 0);
00098 VHACD_VERIFY(pthread_mutex_init(&m_mutex, &mutexAttr) == 0);
00099 VHACD_VERIFY(pthread_mutexattr_destroy(&mutexAttr) == 0);
00100 #endif
00101 }
00102 ~Mutex(void)
00103 {
00104 #if defined(WIN32) || defined(_XBOX)
00105 DeleteCriticalSection(&m_mutex);
00106 #elif defined(__APPLE__) || defined(__linux__)
00107 VHACD_VERIFY(pthread_mutex_destroy(&m_mutex) == 0);
00108 #endif
00109 }
00110 void Lock(void)
00111 {
00112 #if defined(WIN32) || defined(_XBOX)
00113 EnterCriticalSection(&m_mutex);
00114 #elif defined(__APPLE__) || defined(__linux__)
00115 VHACD_VERIFY(pthread_mutex_lock(&m_mutex) == 0);
00116 #endif
00117 }
00118 bool TryLock(void)
00119 {
00120 #if defined(WIN32) || defined(_XBOX)
00121 bool bRet = false;
00122
00123 bRet = TryEnterCriticalSection(&m_mutex) ? true : false;
00124 return bRet;
00125 #elif defined(__APPLE__) || defined(__linux__)
00126 int32_t result = pthread_mutex_trylock(&m_mutex);
00127 return (result == 0);
00128 #endif
00129 }
00130
00131 void Unlock(void)
00132 {
00133 #if defined(WIN32) || defined(_XBOX)
00134 LeaveCriticalSection(&m_mutex);
00135 #elif defined(__APPLE__) || defined(__linux__)
00136 VHACD_VERIFY(pthread_mutex_unlock(&m_mutex) == 0);
00137 #endif
00138 }
00139
00140 private:
00141 #if defined(WIN32) || defined(_XBOX)
00142 CRITICAL_SECTION m_mutex;
00143 #elif defined(__APPLE__) || defined(__linux__)
00144 pthread_mutex_t m_mutex;
00145 #endif
00146 };
00147 }
00148 #endif // VHACD_MUTEX_H