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