12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- #include "precomp_wasabi_bfc.h"
- #include "critsec.h"
- // uncomment this if needed
- //#define CS_DEBUG
- CriticalSection::CriticalSection() {
- #ifdef WIN32
- InitializeCriticalSection(&cs);
- #elif defined(__APPLE__)
- MPCreateCriticalRegion(&cr);
- #elif defined(LINUX)
- pthread_mutex_t recursive = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
- cs.mutex = recursive;
- #endif
- #ifdef ASSERTS_ENABLED
- #ifdef CS_DEBUG
- within = 0;
- #endif
- #endif
- }
- CriticalSection::~CriticalSection() {
- #ifdef CS_DEBUG
- #ifdef ASSERTS_ENABLED
- ASSERT(!within);
- #endif
- #endif
- #ifdef WIN32
- DeleteCriticalSection(&cs);
- #elif defined(__APPLE__)
- MPDeleteCriticalRegion(cr);
- #elif defined(LINUX)
- pthread_mutex_destroy(&cs.mutex);
- #endif
- }
- void CriticalSection::enter() {
- #ifdef WIN32
- EnterCriticalSection(&cs);
- #elif defined(__APPLE__)
- MPEnterCriticalRegion(cr, kDurationForever);
- #elif defined(LINUX)
- pthread_mutex_lock(&cs.mutex);
- #endif
- #ifdef CS_DEBUG
- #ifdef ASSERTS_ENABLED
- ASSERT(!within);
- within = 1;
- #endif
- #endif
- }
- void CriticalSection::leave() {
- #if defined(CS_DEBUG) && defined(ASSERTS_ENABLED)
- ASSERT(within);
- within = 0;
- #endif
- #ifdef WIN32
- LeaveCriticalSection(&cs);
- #elif defined(__APPLE__)
- MPExitCriticalRegion(cr);
- #elif defined(LINUX)
- pthread_mutex_unlock(&cs.mutex);
- #endif
- }
- void CriticalSection::inout() {
- enter();
- leave();
- }
|