Chris@16
|
1 // synchronizaion.hpp --------------------------------------------------------------//
|
Chris@16
|
2
|
Chris@16
|
3 // Copyright 2010 Vicente J. Botet Escriba
|
Chris@16
|
4
|
Chris@16
|
5 // Distributed under the Boost Software License, Version 1.0.
|
Chris@16
|
6 // See http://www.boost.org/LICENSE_1_0.txt
|
Chris@16
|
7
|
Chris@16
|
8
|
Chris@16
|
9 #ifndef BOOST_DETAIL_WINAPI_SYNCHRONIZATION_HPP
|
Chris@16
|
10 #define BOOST_DETAIL_WINAPI_SYNCHRONIZATION_HPP
|
Chris@16
|
11
|
Chris@16
|
12 #include <boost/detail/winapi/basic_types.hpp>
|
Chris@16
|
13
|
Chris@16
|
14 #ifdef BOOST_HAS_PRAGMA_ONCE
|
Chris@16
|
15 #pragma once
|
Chris@16
|
16 #endif
|
Chris@16
|
17
|
Chris@16
|
18 namespace boost
|
Chris@16
|
19 {
|
Chris@16
|
20 namespace detail
|
Chris@16
|
21 {
|
Chris@16
|
22 namespace winapi
|
Chris@16
|
23 {
|
Chris@16
|
24 #if defined( BOOST_USE_WINDOWS_H )
|
Chris@16
|
25 typedef ::CRITICAL_SECTION CRITICAL_SECTION_;
|
Chris@16
|
26 typedef ::PAPCFUNC PAPCFUNC_;
|
Chris@16
|
27
|
Chris@101
|
28 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
|
Chris@101
|
29 typedef ::INIT_ONCE INIT_ONCE_;
|
Chris@101
|
30 typedef ::PINIT_ONCE PINIT_ONCE_;
|
Chris@101
|
31 typedef ::LPINIT_ONCE LPINIT_ONCE_;
|
Chris@101
|
32 #define BOOST_DETAIL_WINAPI_INIT_ONCE_STATIC_INIT INIT_ONCE_STATIC_INIT
|
Chris@101
|
33 typedef ::PINIT_ONCE_FN PINIT_ONCE_FN_;
|
Chris@101
|
34
|
Chris@101
|
35 typedef ::SRWLOCK SRWLOCK_;
|
Chris@101
|
36 typedef ::PSRWLOCK PSRWLOCK_;
|
Chris@101
|
37 #define BOOST_DETAIL_WINAPI_SRWLOCK_INIT SRWLOCK_INIT
|
Chris@101
|
38
|
Chris@101
|
39 typedef ::CONDITION_VARIABLE CONDITION_VARIABLE_;
|
Chris@101
|
40 typedef ::PCONDITION_VARIABLE PCONDITION_VARIABLE_;
|
Chris@101
|
41 #define BOOST_DETAIL_WINAPI_CONDITION_VARIABLE_INIT CONDITION_VARIABLE_INIT
|
Chris@101
|
42 #endif
|
Chris@101
|
43
|
Chris@16
|
44 using ::InitializeCriticalSection;
|
Chris@101
|
45 #if BOOST_USE_WINAPI_VERSION >= 0x0403
|
Chris@101
|
46 using ::InitializeCriticalSectionAndSpinCount;
|
Chris@101
|
47 #endif
|
Chris@16
|
48 using ::EnterCriticalSection;
|
Chris@16
|
49 using ::TryEnterCriticalSection;
|
Chris@16
|
50 using ::LeaveCriticalSection;
|
Chris@16
|
51 using ::DeleteCriticalSection;
|
Chris@16
|
52
|
Chris@16
|
53 # ifdef BOOST_NO_ANSI_APIS
|
Chris@16
|
54 using ::CreateMutexW;
|
Chris@101
|
55 using ::OpenMutexW;
|
Chris@16
|
56 using ::CreateEventW;
|
Chris@16
|
57 using ::OpenEventW;
|
Chris@16
|
58 using ::CreateSemaphoreW;
|
Chris@101
|
59 using ::OpenSemaphoreW;
|
Chris@16
|
60 # else
|
Chris@16
|
61 using ::CreateMutexA;
|
Chris@101
|
62 using ::OpenMutexA;
|
Chris@16
|
63 using ::CreateEventA;
|
Chris@16
|
64 using ::OpenEventA;
|
Chris@16
|
65 using ::CreateSemaphoreA;
|
Chris@101
|
66 using ::OpenSemaphoreA;
|
Chris@16
|
67 # endif
|
Chris@16
|
68 using ::ReleaseMutex;
|
Chris@16
|
69 using ::ReleaseSemaphore;
|
Chris@16
|
70 using ::SetEvent;
|
Chris@16
|
71 using ::ResetEvent;
|
Chris@16
|
72 using ::WaitForMultipleObjects;
|
Chris@16
|
73 using ::WaitForSingleObject;
|
Chris@16
|
74 using ::QueueUserAPC;
|
Chris@16
|
75
|
Chris@101
|
76 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
|
Chris@101
|
77 using ::InitOnceInitialize;
|
Chris@101
|
78 using ::InitOnceExecuteOnce;
|
Chris@101
|
79 using ::InitOnceBeginInitialize;
|
Chris@101
|
80 using ::InitOnceComplete;
|
Chris@101
|
81
|
Chris@101
|
82 using ::InitializeSRWLock;
|
Chris@101
|
83 using ::AcquireSRWLockExclusive;
|
Chris@101
|
84 using ::TryAcquireSRWLockExclusive;
|
Chris@101
|
85 using ::ReleaseSRWLockExclusive;
|
Chris@101
|
86 using ::AcquireSRWLockShared;
|
Chris@101
|
87 using ::TryAcquireSRWLockShared;
|
Chris@101
|
88 using ::ReleaseSRWLockShared;
|
Chris@101
|
89
|
Chris@101
|
90 using ::InitializeConditionVariable;
|
Chris@101
|
91 using ::WakeConditionVariable;
|
Chris@101
|
92 using ::WakeAllConditionVariable;
|
Chris@101
|
93 using ::SleepConditionVariableCS;
|
Chris@101
|
94 using ::SleepConditionVariableSRW;
|
Chris@101
|
95 #endif
|
Chris@101
|
96
|
Chris@16
|
97 const DWORD_ infinite = INFINITE;
|
Chris@16
|
98 const DWORD_ wait_abandoned = WAIT_ABANDONED;
|
Chris@16
|
99 const DWORD_ wait_object_0 = WAIT_OBJECT_0;
|
Chris@16
|
100 const DWORD_ wait_timeout = WAIT_TIMEOUT;
|
Chris@16
|
101 const DWORD_ wait_failed = WAIT_FAILED;
|
Chris@16
|
102
|
Chris@101
|
103 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
|
Chris@101
|
104 const DWORD_ init_once_async = INIT_ONCE_ASYNC;
|
Chris@101
|
105 const DWORD_ init_once_check_only = INIT_ONCE_CHECK_ONLY;
|
Chris@101
|
106 const DWORD_ init_once_init_failed = INIT_ONCE_INIT_FAILED;
|
Chris@101
|
107 const DWORD_ init_once_ctx_reserved_bits = INIT_ONCE_CTX_RESERVED_BITS;
|
Chris@101
|
108
|
Chris@101
|
109 const ULONG_ condition_variable_lockmode_shared = CONDITION_VARIABLE_LOCKMODE_SHARED;
|
Chris@101
|
110 #endif
|
Chris@101
|
111
|
Chris@16
|
112 #else // defined( BOOST_USE_WINDOWS_H )
|
Chris@16
|
113
|
Chris@16
|
114 extern "C" {
|
Chris@16
|
115
|
Chris@101
|
116 typedef struct CRITICAL_SECTION_
|
Chris@16
|
117 {
|
Chris@16
|
118 struct critical_section_debug * DebugInfo;
|
Chris@16
|
119 long LockCount;
|
Chris@16
|
120 long RecursionCount;
|
Chris@16
|
121 void * OwningThread;
|
Chris@16
|
122 void * LockSemaphore;
|
Chris@16
|
123 #if defined(_WIN64)
|
Chris@16
|
124 unsigned __int64 SpinCount;
|
Chris@16
|
125 #else
|
Chris@16
|
126 unsigned long SpinCount;
|
Chris@16
|
127 #endif
|
Chris@101
|
128 }
|
Chris@101
|
129 *PCRITICAL_SECTION_;
|
Chris@16
|
130
|
Chris@101
|
131 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
|
Chris@101
|
132 typedef union INIT_ONCE_
|
Chris@101
|
133 {
|
Chris@101
|
134 PVOID_ Ptr;
|
Chris@101
|
135 }
|
Chris@101
|
136 *PINIT_ONCE_, *LPINIT_ONCE_;
|
Chris@101
|
137 #define BOOST_DETAIL_WINAPI_INIT_ONCE_STATIC_INIT {0}
|
Chris@101
|
138 typedef BOOL_ (WINAPI *PINIT_ONCE_FN_)(PINIT_ONCE_ InitOnce, PVOID_ Parameter, PVOID_ *Context);
|
Chris@16
|
139
|
Chris@101
|
140 typedef struct SRWLOCK_
|
Chris@101
|
141 {
|
Chris@101
|
142 PVOID_ Ptr;
|
Chris@101
|
143 }
|
Chris@101
|
144 * PSRWLOCK_;
|
Chris@101
|
145 #define BOOST_DETAIL_WINAPI_SRWLOCK_INIT {0}
|
Chris@101
|
146
|
Chris@101
|
147 typedef struct CONDITION_VARIABLE_
|
Chris@101
|
148 {
|
Chris@101
|
149 PVOID_ Ptr;
|
Chris@101
|
150 }
|
Chris@101
|
151 * PCONDITION_VARIABLE_;
|
Chris@101
|
152 #define BOOST_DETAIL_WINAPI_CONDITION_VARIABLE_INIT {0}
|
Chris@101
|
153
|
Chris@101
|
154 #endif
|
Chris@101
|
155
|
Chris@101
|
156 __declspec(dllimport) void WINAPI
|
Chris@101
|
157 InitializeCriticalSection(PCRITICAL_SECTION_);
|
Chris@101
|
158 #if BOOST_USE_WINAPI_VERSION >= 0x0403
|
Chris@101
|
159 __declspec(dllimport) BOOL_ WINAPI
|
Chris@101
|
160 InitializeCriticalSectionAndSpinCount(CRITICAL_SECTION_* lpCS, DWORD_ dwSpinCount);
|
Chris@101
|
161 #endif
|
Chris@101
|
162 __declspec(dllimport) void WINAPI
|
Chris@101
|
163 EnterCriticalSection(PCRITICAL_SECTION_);
|
Chris@101
|
164 __declspec(dllimport) BOOL_ WINAPI
|
Chris@101
|
165 TryEnterCriticalSection(PCRITICAL_SECTION_);
|
Chris@101
|
166 __declspec(dllimport) void WINAPI
|
Chris@101
|
167 LeaveCriticalSection(PCRITICAL_SECTION_);
|
Chris@101
|
168 __declspec(dllimport) void WINAPI
|
Chris@101
|
169 DeleteCriticalSection(PCRITICAL_SECTION_);
|
Chris@101
|
170
|
Chris@101
|
171 struct _SECURITY_ATTRIBUTES;
|
Chris@16
|
172 # ifdef BOOST_NO_ANSI_APIS
|
Chris@101
|
173 __declspec(dllimport) HANDLE_ WINAPI
|
Chris@101
|
174 CreateMutexW(_SECURITY_ATTRIBUTES*, BOOL_, LPCWSTR_);
|
Chris@101
|
175 __declspec(dllimport) HANDLE_ WINAPI
|
Chris@101
|
176 OpenMutexW(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCWSTR_ lpName);
|
Chris@101
|
177 __declspec(dllimport) HANDLE_ WINAPI
|
Chris@101
|
178 CreateSemaphoreW(_SECURITY_ATTRIBUTES*, LONG_, LONG_, LPCWSTR_);
|
Chris@101
|
179 __declspec(dllimport) HANDLE_ WINAPI
|
Chris@101
|
180 OpenSemaphoreW(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCWSTR_ lpName);
|
Chris@101
|
181 __declspec(dllimport) HANDLE_ WINAPI
|
Chris@101
|
182 CreateEventW(_SECURITY_ATTRIBUTES*, BOOL_, BOOL_, LPCWSTR_);
|
Chris@101
|
183 __declspec(dllimport) HANDLE_ WINAPI
|
Chris@101
|
184 OpenEventW(DWORD_, BOOL_, LPCWSTR_);
|
Chris@16
|
185 # else
|
Chris@101
|
186 __declspec(dllimport) HANDLE_ WINAPI
|
Chris@101
|
187 CreateMutexA(_SECURITY_ATTRIBUTES*, BOOL_, LPCSTR_);
|
Chris@101
|
188 __declspec(dllimport) HANDLE_ WINAPI
|
Chris@101
|
189 OpenMutexA(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCSTR_ lpName);
|
Chris@101
|
190 __declspec(dllimport) HANDLE_ WINAPI
|
Chris@101
|
191 CreateSemaphoreA(_SECURITY_ATTRIBUTES*, LONG_, LONG_, LPCSTR_);
|
Chris@101
|
192 __declspec(dllimport) HANDLE_ WINAPI
|
Chris@101
|
193 OpenSemaphoreA(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCSTR_ lpName);
|
Chris@101
|
194 __declspec(dllimport) HANDLE_ WINAPI
|
Chris@101
|
195 CreateEventA(_SECURITY_ATTRIBUTES*, BOOL_, BOOL_, LPCSTR_);
|
Chris@101
|
196 __declspec(dllimport) HANDLE_ WINAPI
|
Chris@101
|
197 OpenEventA(DWORD_, BOOL_, LPCSTR_);
|
Chris@16
|
198 # endif
|
Chris@101
|
199 __declspec(dllimport) BOOL_ WINAPI
|
Chris@101
|
200 ReleaseMutex(HANDLE_);
|
Chris@101
|
201 __declspec(dllimport) DWORD_ WINAPI
|
Chris@101
|
202 WaitForSingleObject(HANDLE_, DWORD_);
|
Chris@101
|
203 __declspec(dllimport) DWORD_ WINAPI
|
Chris@101
|
204 WaitForMultipleObjects(DWORD_ nCount,
|
Chris@101
|
205 HANDLE_ const * lpHandles,
|
Chris@101
|
206 BOOL_ bWaitAll,
|
Chris@101
|
207 DWORD_ dwMilliseconds);
|
Chris@101
|
208 __declspec(dllimport) BOOL_ WINAPI
|
Chris@101
|
209 ReleaseSemaphore(HANDLE_, LONG_, LONG_*);
|
Chris@101
|
210 __declspec(dllimport) BOOL_ WINAPI
|
Chris@101
|
211 SetEvent(HANDLE_);
|
Chris@101
|
212 __declspec(dllimport) BOOL_ WINAPI
|
Chris@101
|
213 ResetEvent(HANDLE_);
|
Chris@101
|
214
|
Chris@101
|
215 typedef void (__stdcall *PAPCFUNC_)(ULONG_PTR_);
|
Chris@101
|
216 __declspec(dllimport) DWORD_ WINAPI
|
Chris@101
|
217 QueueUserAPC(PAPCFUNC_, HANDLE_, ULONG_PTR_);
|
Chris@101
|
218
|
Chris@101
|
219 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
|
Chris@101
|
220 __declspec(dllimport) void WINAPI InitOnceInitialize(PINIT_ONCE_);
|
Chris@101
|
221 __declspec(dllimport) BOOL_ WINAPI InitOnceExecuteOnce(PINIT_ONCE_ InitOnce, PINIT_ONCE_FN_ InitFn, PVOID_ Parameter, LPVOID_* Context);
|
Chris@101
|
222 __declspec(dllimport) BOOL_ WINAPI InitOnceBeginInitialize(LPINIT_ONCE_ lpInitOnce, DWORD_ dwFlags, BOOL_* fPending, LPVOID_* lpContext);
|
Chris@101
|
223 __declspec(dllimport) BOOL_ WINAPI InitOnceComplete(LPINIT_ONCE_ lpInitOnce, DWORD_ dwFlags, LPVOID_* lpContext);
|
Chris@101
|
224
|
Chris@101
|
225
|
Chris@101
|
226 __declspec(dllimport) void WINAPI InitializeSRWLock(PSRWLOCK_ SRWLock);
|
Chris@101
|
227 __declspec(dllimport) void WINAPI AcquireSRWLockExclusive(PSRWLOCK_ SRWLock);
|
Chris@101
|
228 __declspec(dllimport) BOOLEAN_ WINAPI TryAcquireSRWLockExclusive(PSRWLOCK_ SRWLock);
|
Chris@101
|
229 __declspec(dllimport) void WINAPI ReleaseSRWLockExclusive(PSRWLOCK_ SRWLock);
|
Chris@101
|
230 __declspec(dllimport) void WINAPI AcquireSRWLockShared(PSRWLOCK_ SRWLock);
|
Chris@101
|
231 __declspec(dllimport) BOOLEAN_ WINAPI TryAcquireSRWLockShared(PSRWLOCK_ SRWLock);
|
Chris@101
|
232 __declspec(dllimport) void WINAPI ReleaseSRWLockShared(PSRWLOCK_ SRWLock);
|
Chris@101
|
233
|
Chris@101
|
234 __declspec(dllimport) void WINAPI InitializeConditionVariable(PCONDITION_VARIABLE_ ConditionVariable);
|
Chris@101
|
235 __declspec(dllimport) void WINAPI WakeConditionVariable(PCONDITION_VARIABLE_ ConditionVariable);
|
Chris@101
|
236 __declspec(dllimport) void WINAPI WakeAllConditionVariable(PCONDITION_VARIABLE_ ConditionVariable);
|
Chris@101
|
237 __declspec(dllimport) BOOL_ WINAPI SleepConditionVariableCS(PCONDITION_VARIABLE_ ConditionVariable, PCRITICAL_SECTION_ CriticalSection, DWORD_ dwMilliseconds);
|
Chris@101
|
238 __declspec(dllimport) BOOL_ WINAPI SleepConditionVariableSRW(PCONDITION_VARIABLE_ ConditionVariable, PSRWLOCK_ SRWLock, DWORD_ dwMilliseconds, ULONG_ Flags);
|
Chris@101
|
239 #endif
|
Chris@16
|
240
|
Chris@16
|
241 } // extern "C"
|
Chris@16
|
242
|
Chris@101
|
243 const DWORD_ infinite = (DWORD_)0xFFFFFFFF;
|
Chris@101
|
244 const DWORD_ wait_abandoned = 0x00000080L;
|
Chris@101
|
245 const DWORD_ wait_object_0 = 0x00000000L;
|
Chris@101
|
246 const DWORD_ wait_timeout = 0x00000102L;
|
Chris@101
|
247 const DWORD_ wait_failed = (DWORD_)0xFFFFFFFF;
|
Chris@101
|
248
|
Chris@101
|
249 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
|
Chris@101
|
250 const DWORD_ init_once_async = 0x00000002UL;
|
Chris@101
|
251 const DWORD_ init_once_check_only = 0x00000001UL;
|
Chris@101
|
252 const DWORD_ init_once_init_failed = 0x00000004UL;
|
Chris@101
|
253 const DWORD_ init_once_ctx_reserved_bits = 2;
|
Chris@101
|
254
|
Chris@101
|
255 const ULONG_ condition_variable_lockmode_shared = 0x00000001;
|
Chris@101
|
256 #endif
|
Chris@16
|
257
|
Chris@16
|
258 #endif // defined( BOOST_USE_WINDOWS_H )
|
Chris@16
|
259
|
Chris@101
|
260 const DWORD_ max_non_infinite_wait = (DWORD_)0xFFFFFFFE;
|
Chris@101
|
261
|
Chris@101
|
262 BOOST_FORCEINLINE HANDLE_ create_anonymous_mutex(_SECURITY_ATTRIBUTES* lpAttributes, BOOL_ bInitialOwner)
|
Chris@101
|
263 {
|
Chris@101
|
264 #ifdef BOOST_NO_ANSI_APIS
|
Chris@101
|
265 return CreateMutexW(lpAttributes, bInitialOwner, 0);
|
Chris@101
|
266 #else
|
Chris@101
|
267 return CreateMutexA(lpAttributes, bInitialOwner, 0);
|
Chris@101
|
268 #endif
|
Chris@101
|
269 }
|
Chris@101
|
270
|
Chris@101
|
271 BOOST_FORCEINLINE HANDLE_ create_anonymous_semaphore(_SECURITY_ATTRIBUTES* lpAttributes, LONG_ lInitialCount, LONG_ lMaximumCount)
|
Chris@101
|
272 {
|
Chris@101
|
273 #ifdef BOOST_NO_ANSI_APIS
|
Chris@101
|
274 return CreateSemaphoreW(lpAttributes, lInitialCount, lMaximumCount, 0);
|
Chris@101
|
275 #else
|
Chris@101
|
276 return CreateSemaphoreA(lpAttributes, lInitialCount, lMaximumCount, 0);
|
Chris@101
|
277 #endif
|
Chris@101
|
278 }
|
Chris@101
|
279
|
Chris@101
|
280 BOOST_FORCEINLINE HANDLE_ create_anonymous_event(_SECURITY_ATTRIBUTES* lpAttributes, BOOL_ bManualReset, BOOL_ bInitialState)
|
Chris@101
|
281 {
|
Chris@101
|
282 #ifdef BOOST_NO_ANSI_APIS
|
Chris@101
|
283 return CreateEventW(lpAttributes, bManualReset, bInitialState, 0);
|
Chris@101
|
284 #else
|
Chris@101
|
285 return CreateEventA(lpAttributes, bManualReset, bInitialState, 0);
|
Chris@101
|
286 #endif
|
Chris@101
|
287 }
|
Chris@101
|
288
|
Chris@16
|
289 }
|
Chris@16
|
290 }
|
Chris@16
|
291 }
|
Chris@16
|
292
|
Chris@16
|
293 #endif // BOOST_DETAIL_WINAPI_SYNCHRONIZATION_HPP
|