1 /*
2  * Copyright 2010 Vicente J. Botet Escriba
3  * Copyright 2015 Andrey Semashev
4  *
5  * Distributed under the Boost Software License, Version 1.0.
6  * See http://www.boost.org/LICENSE_1_0.txt
7  */
8 
9 #ifndef BOOST_WINAPI_CONDITION_VARIABLE_HPP_INCLUDED_
10 #define BOOST_WINAPI_CONDITION_VARIABLE_HPP_INCLUDED_
11 
12 #include <boost/winapi/config.hpp>
13 
14 #ifdef BOOST_HAS_PRAGMA_ONCE
15 #pragma once
16 #endif
17 
18 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
19 
20 #include <boost/winapi/basic_types.hpp>
21 #include <boost/winapi/detail/header.hpp>
22 
23 #if !defined( BOOST_USE_WINDOWS_H )
24 extern "C" {
25 struct _RTL_CONDITION_VARIABLE;
26 struct _RTL_CRITICAL_SECTION;
27 struct _RTL_SRWLOCK;
28 
29 BOOST_WINAPI_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
30 InitializeConditionVariable(::_RTL_CONDITION_VARIABLE* ConditionVariable);
31 
32 BOOST_WINAPI_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
33 WakeConditionVariable(::_RTL_CONDITION_VARIABLE* ConditionVariable);
34 
35 BOOST_WINAPI_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
36 WakeAllConditionVariable(::_RTL_CONDITION_VARIABLE* ConditionVariable);
37 
38 BOOST_WINAPI_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
39 SleepConditionVariableCS(
40     ::_RTL_CONDITION_VARIABLE* ConditionVariable,
41     ::_RTL_CRITICAL_SECTION* CriticalSection,
42     boost::winapi::DWORD_ dwMilliseconds);
43 
44 BOOST_WINAPI_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
45 SleepConditionVariableSRW(
46     ::_RTL_CONDITION_VARIABLE* ConditionVariable,
47     ::_RTL_SRWLOCK* SRWLock,
48     boost::winapi::DWORD_ dwMilliseconds,
49     boost::winapi::ULONG_ Flags);
50 }
51 #endif
52 
53 namespace boost {
54 namespace winapi {
55 
56 typedef struct BOOST_MAY_ALIAS _RTL_CONDITION_VARIABLE {
57     PVOID_ Ptr;
58 } CONDITION_VARIABLE_, *PCONDITION_VARIABLE_;
59 
60 #if defined( BOOST_USE_WINDOWS_H )
61 #define BOOST_WINAPI_CONDITION_VARIABLE_INIT CONDITION_VARIABLE_INIT
62 #else
63 #define BOOST_WINAPI_CONDITION_VARIABLE_INIT {0}
64 #endif
65 
66 struct _RTL_CRITICAL_SECTION;
67 struct _RTL_SRWLOCK;
68 
InitializeConditionVariable(PCONDITION_VARIABLE_ ConditionVariable)69 BOOST_FORCEINLINE VOID_ InitializeConditionVariable(PCONDITION_VARIABLE_ ConditionVariable)
70 {
71     ::InitializeConditionVariable(reinterpret_cast< ::_RTL_CONDITION_VARIABLE* >(ConditionVariable));
72 }
73 
WakeConditionVariable(PCONDITION_VARIABLE_ ConditionVariable)74 BOOST_FORCEINLINE VOID_ WakeConditionVariable(PCONDITION_VARIABLE_ ConditionVariable)
75 {
76     ::WakeConditionVariable(reinterpret_cast< ::_RTL_CONDITION_VARIABLE* >(ConditionVariable));
77 }
78 
WakeAllConditionVariable(PCONDITION_VARIABLE_ ConditionVariable)79 BOOST_FORCEINLINE VOID_ WakeAllConditionVariable(PCONDITION_VARIABLE_ ConditionVariable)
80 {
81     ::WakeAllConditionVariable(reinterpret_cast< ::_RTL_CONDITION_VARIABLE* >(ConditionVariable));
82 }
83 
SleepConditionVariableCS(PCONDITION_VARIABLE_ ConditionVariable,_RTL_CRITICAL_SECTION * CriticalSection,DWORD_ dwMilliseconds)84 BOOST_FORCEINLINE BOOL_ SleepConditionVariableCS(
85     PCONDITION_VARIABLE_ ConditionVariable,
86     _RTL_CRITICAL_SECTION* CriticalSection,
87     DWORD_ dwMilliseconds)
88 {
89     return ::SleepConditionVariableCS(
90         reinterpret_cast< ::_RTL_CONDITION_VARIABLE* >(ConditionVariable),
91         reinterpret_cast< ::_RTL_CRITICAL_SECTION* >(CriticalSection),
92         dwMilliseconds);
93 }
94 
SleepConditionVariableSRW(PCONDITION_VARIABLE_ ConditionVariable,_RTL_SRWLOCK * SRWLock,DWORD_ dwMilliseconds,ULONG_ Flags)95 BOOST_FORCEINLINE BOOL_ SleepConditionVariableSRW(
96     PCONDITION_VARIABLE_ ConditionVariable,
97     _RTL_SRWLOCK* SRWLock,
98     DWORD_ dwMilliseconds,
99     ULONG_ Flags)
100 {
101     return ::SleepConditionVariableSRW(
102         reinterpret_cast< ::_RTL_CONDITION_VARIABLE* >(ConditionVariable),
103         reinterpret_cast< ::_RTL_SRWLOCK* >(SRWLock),
104         dwMilliseconds,
105         Flags);
106 }
107 
108 #if defined( BOOST_USE_WINDOWS_H )
109 BOOST_CONSTEXPR_OR_CONST ULONG_ CONDITION_VARIABLE_LOCKMODE_SHARED_ = CONDITION_VARIABLE_LOCKMODE_SHARED;
110 #else // defined( BOOST_USE_WINDOWS_H )
111 BOOST_CONSTEXPR_OR_CONST ULONG_ CONDITION_VARIABLE_LOCKMODE_SHARED_ = 0x00000001;
112 #endif // defined( BOOST_USE_WINDOWS_H )
113 
114 BOOST_CONSTEXPR_OR_CONST ULONG_ condition_variable_lockmode_shared = CONDITION_VARIABLE_LOCKMODE_SHARED_;
115 
116 }
117 }
118 
119 #include <boost/winapi/detail/footer.hpp>
120 
121 #endif // BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
122 
123 #endif // BOOST_WINAPI_CONDITION_VARIABLE_HPP_INCLUDED_
124