X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fplatform%2Fwindows%2Fos-threads.h;h=e39b6011b277ce1359fb522ad0cd735d25b1be88;hb=d9de2aae6b2f47b8e1faacc69adba7406b9d85f0;hp=0e738684a1f599dca64e567ed60c731acb87ee0b;hpb=d0a712a65c05b4bf7bf25eafb8b4c999b6888a42;p=deb_libcec.git diff --git a/src/lib/platform/windows/os-threads.h b/src/lib/platform/windows/os-threads.h index 0e73868..e39b601 100644 --- a/src/lib/platform/windows/os-threads.h +++ b/src/lib/platform/windows/os-threads.h @@ -2,7 +2,7 @@ /* * This file is part of the libCEC(R) library. * - * libCEC(R) is Copyright (C) 2011 Pulse-Eight Limited. All rights reserved. + * libCEC(R) is Copyright (C) 2011-2013 Pulse-Eight Limited. All rights reserved. * libCEC(R) is an original work, containing original code. * * libCEC(R) is a trademark of Pulse-Eight Limited. @@ -31,35 +31,38 @@ * http://www.pulse-eight.net/ */ +#include + namespace PLATFORM { #define thread_t HANDLE + #define INVALID_THREAD_VALUE NULL #define ThreadsWait(thread, retVal) (::WaitForSingleObject(thread, INFINITE) < 0) #define ThreadsCreate(thread, func, arg) ((thread = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)func, arg, 0, NULL)) == NULL ? false : true) typedef CRITICAL_SECTION* mutex_t; #define MutexCreate(mutex) ::InitializeCriticalSection(mutex = new CRITICAL_SECTION) #define MutexDelete(mutex) ::DeleteCriticalSection(mutex); delete mutex - #define MutexLock(mutex) ::EnterCriticalSection(mutex) + inline bool MutexLock(mutex_t mutex) {::EnterCriticalSection(mutex); return true; } #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) - #define ConditionWait(cond, mutex, timeout) ::ResetEvent(cond); \ - MutexUnlock(mutex); \ - ::WaitForSingleObject(cond, timeout <= 0 ? 1000 : timeout); \ - MutexLock(mutex) - #endif + // windows vista+ conditions + typedef VOID (WINAPI *ConditionArg) (CONDITION_VARIABLE*); + typedef BOOL (WINAPI *ConditionMutexArg)(CONDITION_VARIABLE*, CRITICAL_SECTION*, DWORD); + + class CConditionImpl + { + 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; + }; }