1a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/* 2a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * 4a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * Use of this source code is governed by a BSD-style license 5a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * that can be found in the LICENSE file in the root of the source 6a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * tree. An additional intellectual property rights grant can be found 7a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * in the file PATENTS. All contributing project authors may 8a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * be found in the AUTHORS file in the root of the source tree. 9a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin */ 10a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 11a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#ifndef WEBRTC_SYSTEM_WRAPPERS_SOURCE_CONDITION_VARIABLE_WINDOWS_H_ 12a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_CONDITION_VARIABLE_WINDOWS_H_ 13a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 14a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#include "condition_variable_wrapper.h" 15a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 16a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#include <windows.h> 17a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 18a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinnamespace webrtc { 19a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#if !defined CONDITION_VARIABLE_INIT 20a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin typedef struct _RTL_CONDITION_VARIABLE 21a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin { 22a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin void* Ptr; 23a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin } RTL_CONDITION_VARIABLE, *PRTL_CONDITION_VARIABLE; 24a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 25a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin typedef RTL_CONDITION_VARIABLE CONDITION_VARIABLE, *PCONDITION_VARIABLE; 26a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#endif 27a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 28a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkintypedef void (WINAPI *PInitializeConditionVariable)(PCONDITION_VARIABLE); 29a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkintypedef BOOL (WINAPI *PSleepConditionVariableCS)(PCONDITION_VARIABLE, 30a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin PCRITICAL_SECTION, DWORD); 31a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkintypedef void (WINAPI *PWakeConditionVariable)(PCONDITION_VARIABLE); 32a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkintypedef void (WINAPI *PWakeAllConditionVariable)(PCONDITION_VARIABLE); 33a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 34a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 35a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinclass ConditionVariableWindows : public ConditionVariableWrapper 36a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin{ 37a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinpublic: 38a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin ConditionVariableWindows(); 39a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin ~ConditionVariableWindows(); 40a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 41a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin void SleepCS(CriticalSectionWrapper& critSect); 42a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin bool SleepCS(CriticalSectionWrapper& critSect, unsigned long maxTimeInMS); 43a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin void Wake(); 44a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin void WakeAll(); 45a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 46a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinprivate: 47a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin enum EventWakeUpType 48a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin { 49a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WAKEALL_0 = 0, 50a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WAKEALL_1 = 1, 51a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WAKE = 2, 52a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin EVENT_COUNT = 3 53a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin }; 54a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 55a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinprivate: 56a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin // Native support for Windows Vista+ 57a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin static bool _winSupportConditionVariablesPrimitive; 58a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin CONDITION_VARIABLE _conditionVariable; 59a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 60a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin unsigned int _numWaiters[2]; 61a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin EventWakeUpType _eventID; 62a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin CRITICAL_SECTION _numWaitersCritSect; 63a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin HANDLE _events[EVENT_COUNT]; 64a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin}; 65a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin} // namespace webrtc 66a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 67a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#endif // WEBRTC_SYSTEM_WRAPPERS_SOURCE_CONDITION_VARIABLE_WINDOWS_H_ 68