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 
22 #if !defined( BOOST_USE_WINDOWS_H )
23 extern "C" {
24 struct _RTL_CONDITION_VARIABLE;
25 struct _RTL_CRITICAL_SECTION;
26 struct _RTL_SRWLOCK;
27 
28 BOOST_SYMBOL_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
29 InitializeConditionVariable(::_RTL_CONDITION_VARIABLE* ConditionVariable);
30 
31 BOOST_SYMBOL_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
32 WakeConditionVariable(::_RTL_CONDITION_VARIABLE* ConditionVariable);
33 
34 BOOST_SYMBOL_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
35 WakeAllConditionVariable(::_RTL_CONDITION_VARIABLE* ConditionVariable);
36 
37 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
38 SleepConditionVariableCS(
39     ::_RTL_CONDITION_VARIABLE* ConditionVariable,
40     ::_RTL_CRITICAL_SECTION* CriticalSection,
41     boost::winapi::DWORD_ dwMilliseconds);
42 
43 BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
44 SleepConditionVariableSRW(
45     ::_RTL_CONDITION_VARIABLE* ConditionVariable,
46     ::_RTL_SRWLOCK* SRWLock,
47     boost::winapi::DWORD_ dwMilliseconds,
48     boost::winapi::ULONG_ Flags);
49 }
50 #endif
51 
52 namespace boost {
53 namespace winapi {
54 
55 typedef struct BOOST_MAY_ALIAS _RTL_CONDITION_VARIABLE {
56     PVOID_ Ptr;
57 } CONDITION_VARIABLE_, *PCONDITION_VARIABLE_;
58 
59 #if defined( BOOST_USE_WINDOWS_H )
60 #define BOOST_WINAPI_CONDITION_VARIABLE_INIT CONDITION_VARIABLE_INIT
61 #else
62 #define BOOST_WINAPI_CONDITION_VARIABLE_INIT {0}
63 #endif
64 
65 struct _RTL_CRITICAL_SECTION;
66 struct _RTL_SRWLOCK;
67 
InitializeConditionVariable(PCONDITION_VARIABLE_ ConditionVariable)68 BOOST_FORCEINLINE VOID_ InitializeConditionVariable(PCONDITION_VARIABLE_ ConditionVariable)
69 {
70     ::InitializeConditionVariable(reinterpret_cast< ::_RTL_CONDITION_VARIABLE* >(ConditionVariable));
71 }
72 
WakeConditionVariable(PCONDITION_VARIABLE_ ConditionVariable)73 BOOST_FORCEINLINE VOID_ WakeConditionVariable(PCONDITION_VARIABLE_ ConditionVariable)
74 {
75     ::WakeConditionVariable(reinterpret_cast< ::_RTL_CONDITION_VARIABLE* >(ConditionVariable));
76 }
77 
WakeAllConditionVariable(PCONDITION_VARIABLE_ ConditionVariable)78 BOOST_FORCEINLINE VOID_ WakeAllConditionVariable(PCONDITION_VARIABLE_ ConditionVariable)
79 {
80     ::WakeAllConditionVariable(reinterpret_cast< ::_RTL_CONDITION_VARIABLE* >(ConditionVariable));
81 }
82 
SleepConditionVariableCS(PCONDITION_VARIABLE_ ConditionVariable,_RTL_CRITICAL_SECTION * CriticalSection,DWORD_ dwMilliseconds)83 BOOST_FORCEINLINE BOOL_ SleepConditionVariableCS(
84     PCONDITION_VARIABLE_ ConditionVariable,
85     _RTL_CRITICAL_SECTION* CriticalSection,
86     DWORD_ dwMilliseconds)
87 {
88     return ::SleepConditionVariableCS(
89         reinterpret_cast< ::_RTL_CONDITION_VARIABLE* >(ConditionVariable),
90         reinterpret_cast< ::_RTL_CRITICAL_SECTION* >(CriticalSection),
91         dwMilliseconds);
92 }
93 
SleepConditionVariableSRW(PCONDITION_VARIABLE_ ConditionVariable,_RTL_SRWLOCK * SRWLock,DWORD_ dwMilliseconds,ULONG_ Flags)94 BOOST_FORCEINLINE BOOL_ SleepConditionVariableSRW(
95     PCONDITION_VARIABLE_ ConditionVariable,
96     _RTL_SRWLOCK* SRWLock,
97     DWORD_ dwMilliseconds,
98     ULONG_ Flags)
99 {
100     return ::SleepConditionVariableSRW(
101         reinterpret_cast< ::_RTL_CONDITION_VARIABLE* >(ConditionVariable),
102         reinterpret_cast< ::_RTL_SRWLOCK* >(SRWLock),
103         dwMilliseconds,
104         Flags);
105 }
106 
107 #if defined( BOOST_USE_WINDOWS_H )
108 BOOST_CONSTEXPR_OR_CONST ULONG_ CONDITION_VARIABLE_LOCKMODE_SHARED_ = CONDITION_VARIABLE_LOCKMODE_SHARED;
109 #else // defined( BOOST_USE_WINDOWS_H )
110 BOOST_CONSTEXPR_OR_CONST ULONG_ CONDITION_VARIABLE_LOCKMODE_SHARED_ = 0x00000001;
111 #endif // defined( BOOST_USE_WINDOWS_H )
112 
113 BOOST_CONSTEXPR_OR_CONST ULONG_ condition_variable_lockmode_shared = CONDITION_VARIABLE_LOCKMODE_SHARED_;
114 
115 }
116 }
117 
118 #endif // BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
119 
120 #endif // BOOST_WINAPI_CONDITION_VARIABLE_HPP_INCLUDED_
121