- #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