#include "piconditionlock.h" #ifdef WINDOWS #include "synchapi.h" #else #include "pthread.h" #endif PRIVATE_DEFINITION_START(PIConditionLock) #ifdef WINDOWS CRITICAL_SECTION #else pthread_mutex_t #endif nativeHandle; PRIVATE_DEFINITION_END(PIConditionLock) #ifdef WINDOWS PIConditionLock::PIConditionLock() { InitializeCriticalSection(&PRIVATE->nativeHandle); } PIConditionLock::~PIConditionLock() { DeleteCriticalSection(&PRIVATE->nativeHandle); } void PIConditionLock::lock() { EnterCriticalSection(&PRIVATE->nativeHandle); } void PIConditionLock::unlock() { LeaveCriticalSection(&PRIVATE->nativeHandle); } void *PIConditionLock::handle() { return &PRIVATE->nativeHandle; } bool PIConditionLock::tryLock() { return TryEnterCriticalSection(&PRIVATE->nativeHandle) != 0; } #else PIConditionLock::PIConditionLock() { pthread_mutexattr_t attr; memset(&attr, 0, sizeof(attr)); pthread_mutexattr_init(&attr); pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); memset(&(PRIVATE->nativeHandle), 0, sizeof(PRIVATE->nativeHandle)); pthread_mutex_init(&(PRIVATE->nativeHandle), &attr); pthread_mutexattr_destroy(&attr); } PIConditionLock::~PIConditionLock() { pthread_mutex_destroy(&(PRIVATE->nativeHandle)); } void PIConditionLock::lock() { pthread_mutex_lock(&(PRIVATE->nativeHandle)); } void PIConditionLock::unlock() { pthread_mutex_unlock(&(PRIVATE->nativeHandle)); } void *PIConditionLock::handle() { return &PRIVATE->nativeHandle; } bool PIConditionLock::tryLock() { return (pthread_mutex_trylock(&(PRIVATE->nativeHandle)) == 0); } #endif