#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;
+ };
}