X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fplatform%2Fwindows%2Fos-threads.h;h=3714c16711950919edd768708e5d2cee4fa48594;hb=679dfa075ef915793de454b2f803ce8fe09d30b4;hp=df1af39e5f0c82e6daa918eb8b99fefafd515853;hpb=6a3e78564b615c0fcb71887f93df79bf5d83a741;p=deb_libcec.git diff --git a/src/lib/platform/windows/os-threads.h b/src/lib/platform/windows/os-threads.h index df1af39..3714c16 100644 --- a/src/lib/platform/windows/os-threads.h +++ b/src/lib/platform/windows/os-threads.h @@ -44,26 +44,22 @@ namespace PLATFORM #define MutexTryLock(mutex) (::TryEnterCriticalSection(mutex) != 0) #define MutexUnlock(mutex) ::LeaveCriticalSection(mutex) - #if (_WIN32_WINNT >= _WIN32_WINNT_VISTA) - typedef CONDITION_VARIABLE* condition_t; - #define ConditionCreate(cond) ::InitializeConditionVariable(cond = new CONDITION_VARIABLE) - #define ConditionDelete(cond) delete cond - #define ConditionSignal(cond) ::WakeConditionVariable(cond) - #define ConditionBroadcast(cond) ::WakeAllConditionVariable(cond) - #define ConditionWait(cond, mutex, timeout) (::SleepConditionVariableCS(cond, mutex, timeout <= 0 ? INFINITE : timeout) ? true : false) - #else - typedef HANDLE condition_t; - #define ConditionCreate(cond) (cond = ::CreateEvent(NULL, TRUE, FALSE, NULL)) - #define ConditionDelete(cond) ::CloseHandle(cond) - #define ConditionSignal(cond) ::SetEvent(cond) - #define ConditionBroadcast(cond) ::SetEvent(cond) - inline bool ConditionWait(condition_t cond, mutex_t mutex, uint32_t iTimeoutMsg) + // windows vista+ conditions + typedef VOID (WINAPI *ConditionArg) (CONDITION_VARIABLE*); + typedef BOOL (WINAPI *ConditionMutexArg)(CONDITION_VARIABLE*, CRITICAL_SECTION*, DWORD); + + class CConditionImpl { - ::ResetEvent(cond); - MutexUnlock(mutex); - DWORD iWaitReturn = ::WaitForSingleObject(cond, iTimeoutMsg <= 0 ? 1000 : iTimeoutMsg); - MutexLock(mutex); - return iWaitReturn == 0; - } - #endif + public: + CConditionImpl(void); + virtual ~CConditionImpl(void); + void Signal(void); + void Broadcast(void); + bool Wait(mutex_t &mutex); + bool Wait(mutex_t &mutex, uint32_t iTimeoutMs); + + bool m_bOnVista; + CONDITION_VARIABLE *m_conditionVista; + HANDLE m_conditionPreVista; + }; }