/*
* This file is part of the libCEC(R) library.
*
- * libCEC(R) is Copyright (C) 2011-2012 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.
* http://www.pulse-eight.net/
*/
+#include <stdint.h>
+
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)
- 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;
+ };
}