]>
Commit | Line | Data |
---|---|---|
b32b8144 FG |
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 | */ | |
7c673cae | 8 | |
b32b8144 FG |
9 | #ifndef BOOST_WINAPI_CRITICAL_SECTION_HPP_INCLUDED_ |
10 | #define BOOST_WINAPI_CRITICAL_SECTION_HPP_INCLUDED_ | |
7c673cae | 11 | |
b32b8144 FG |
12 | #include <boost/winapi/basic_types.hpp> |
13 | #include <boost/winapi/detail/cast_ptr.hpp> | |
20effc67 | 14 | #include <boost/winapi/detail/header.hpp> |
7c673cae FG |
15 | |
16 | #ifdef BOOST_HAS_PRAGMA_ONCE | |
17 | #pragma once | |
18 | #endif | |
19 | ||
20 | #if !defined( BOOST_USE_WINDOWS_H ) | |
21 | ||
22 | extern "C" { | |
23 | #if !defined( BOOST_WINAPI_IS_MINGW ) | |
20effc67 TL |
24 | |
25 | // Windows CE uses a different name for the structure | |
26 | #if defined (_WIN32_WCE) | |
27 | struct CRITICAL_SECTION; | |
28 | namespace boost { | |
29 | namespace winapi { | |
30 | namespace detail { | |
31 | typedef CRITICAL_SECTION winsdk_critical_section; | |
32 | } | |
33 | } | |
34 | } | |
35 | #else | |
7c673cae | 36 | struct _RTL_CRITICAL_SECTION; |
20effc67 TL |
37 | namespace boost { |
38 | namespace winapi { | |
39 | namespace detail { | |
40 | typedef _RTL_CRITICAL_SECTION winsdk_critical_section; | |
41 | } | |
42 | } | |
43 | } | |
44 | #endif | |
45 | ||
46 | #else | |
47 | // MinGW uses a different name for the structure | |
48 | struct _CRITICAL_SECTION; | |
49 | ||
50 | namespace boost { | |
51 | namespace winapi { | |
52 | namespace detail { | |
53 | typedef _CRITICAL_SECTION winapi_critical_section; | |
54 | } | |
55 | } | |
56 | } | |
57 | #endif | |
58 | ||
59 | #if !defined( BOOST_WINAPI_IS_MINGW ) | |
7c673cae | 60 | |
b32b8144 | 61 | #if BOOST_WINAPI_PARTITION_APP_SYSTEM |
20effc67 TL |
62 | BOOST_WINAPI_IMPORT_EXCEPT_WM boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC |
63 | InitializeCriticalSection(boost::winapi::detail::winsdk_critical_section* lpCriticalSection); | |
b32b8144 | 64 | #endif |
7c673cae | 65 | |
20effc67 TL |
66 | BOOST_WINAPI_IMPORT_EXCEPT_WM boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC |
67 | EnterCriticalSection(boost::winapi::detail::winsdk_critical_section* lpCriticalSection); | |
7c673cae | 68 | |
20effc67 TL |
69 | BOOST_WINAPI_IMPORT_EXCEPT_WM boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC |
70 | LeaveCriticalSection(boost::winapi::detail::winsdk_critical_section* lpCriticalSection); | |
7c673cae FG |
71 | |
72 | #if BOOST_USE_WINAPI_VERSION >= 0x0403 | |
b32b8144 | 73 | #if BOOST_WINAPI_PARTITION_APP_SYSTEM |
20effc67 | 74 | BOOST_WINAPI_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC |
7c673cae | 75 | InitializeCriticalSectionAndSpinCount( |
20effc67 | 76 | boost::winapi::detail::winsdk_critical_section* lpCriticalSection, |
b32b8144 | 77 | boost::winapi::DWORD_ dwSpinCount); |
7c673cae | 78 | |
20effc67 | 79 | BOOST_WINAPI_IMPORT boost::winapi::DWORD_ BOOST_WINAPI_WINAPI_CC |
b32b8144 | 80 | SetCriticalSectionSpinCount( |
20effc67 | 81 | boost::winapi::detail::winsdk_critical_section* lpCriticalSection, |
b32b8144 | 82 | boost::winapi::DWORD_ dwSpinCount); |
7c673cae FG |
83 | #endif |
84 | ||
b32b8144 | 85 | #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6 |
20effc67 | 86 | BOOST_WINAPI_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC |
b32b8144 | 87 | InitializeCriticalSectionEx( |
20effc67 | 88 | boost::winapi::detail::winsdk_critical_section* lpCriticalSection, |
b32b8144 FG |
89 | boost::winapi::DWORD_ dwSpinCount, |
90 | boost::winapi::DWORD_ Flags); | |
91 | #endif | |
7c673cae FG |
92 | #endif |
93 | ||
94 | #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_NT4 | |
20effc67 TL |
95 | BOOST_WINAPI_IMPORT_EXCEPT_WM boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC |
96 | TryEnterCriticalSection(boost::winapi::detail::winsdk_critical_section* lpCriticalSection); | |
7c673cae FG |
97 | #endif |
98 | ||
20effc67 TL |
99 | BOOST_WINAPI_IMPORT_EXCEPT_WM boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC |
100 | DeleteCriticalSection(boost::winapi::detail::winsdk_critical_section* lpCriticalSection); | |
7c673cae FG |
101 | |
102 | #else // defined( BOOST_WINAPI_IS_MINGW ) | |
103 | ||
20effc67 TL |
104 | BOOST_WINAPI_IMPORT_EXCEPT_WM boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC |
105 | InitializeCriticalSection(boost::winapi::detail::winapi_critical_section* lpCriticalSection); | |
7c673cae | 106 | |
20effc67 TL |
107 | BOOST_WINAPI_IMPORT_EXCEPT_WM boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC |
108 | EnterCriticalSection(boost::winapi::detail::winapi_critical_section* lpCriticalSection); | |
7c673cae | 109 | |
20effc67 TL |
110 | BOOST_WINAPI_IMPORT_EXCEPT_WM boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC |
111 | LeaveCriticalSection(boost::winapi::detail::winapi_critical_section* lpCriticalSection); | |
7c673cae FG |
112 | |
113 | #if BOOST_USE_WINAPI_VERSION >= 0x0403 | |
20effc67 | 114 | BOOST_WINAPI_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC |
7c673cae | 115 | InitializeCriticalSectionAndSpinCount( |
20effc67 | 116 | boost::winapi::detail::winapi_critical_section* lpCriticalSection, |
b32b8144 | 117 | boost::winapi::DWORD_ dwSpinCount); |
7c673cae | 118 | |
20effc67 TL |
119 | BOOST_WINAPI_IMPORT boost::winapi::DWORD_ BOOST_WINAPI_WINAPI_CC |
120 | SetCriticalSectionSpinCount( | |
121 | boost::winapi::detail::winapi_critical_section* lpCriticalSection, | |
122 | boost::winapi::DWORD_ dwSpinCount); | |
123 | #endif | |
124 | ||
7c673cae | 125 | #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6 |
20effc67 | 126 | BOOST_WINAPI_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC |
7c673cae | 127 | InitializeCriticalSectionEx( |
20effc67 | 128 | boost::winapi::detail::winapi_critical_section* lpCriticalSection, |
b32b8144 FG |
129 | boost::winapi::DWORD_ dwSpinCount, |
130 | boost::winapi::DWORD_ Flags); | |
7c673cae FG |
131 | #endif |
132 | ||
7c673cae | 133 | #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_NT4 |
20effc67 TL |
134 | BOOST_WINAPI_IMPORT_EXCEPT_WM boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC |
135 | TryEnterCriticalSection(boost::winapi::detail::winapi_critical_section* lpCriticalSection); | |
7c673cae FG |
136 | #endif |
137 | ||
20effc67 TL |
138 | BOOST_WINAPI_IMPORT_EXCEPT_WM boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC |
139 | DeleteCriticalSection(boost::winapi::detail::winapi_critical_section* lpCriticalSection); | |
7c673cae FG |
140 | |
141 | #endif // defined( BOOST_WINAPI_IS_MINGW ) | |
b32b8144 | 142 | } // extern "C" |
7c673cae FG |
143 | #endif |
144 | ||
145 | namespace boost { | |
7c673cae FG |
146 | namespace winapi { |
147 | ||
7c673cae FG |
148 | |
149 | #pragma pack(push, 8) | |
150 | ||
20effc67 TL |
151 | #if !defined(_WIN32_WCE) |
152 | ||
153 | struct _RTL_CRITICAL_SECTION_DEBUG; | |
154 | ||
b32b8144 | 155 | typedef struct BOOST_MAY_ALIAS _RTL_CRITICAL_SECTION { |
7c673cae FG |
156 | _RTL_CRITICAL_SECTION_DEBUG* DebugInfo; |
157 | LONG_ LockCount; | |
158 | LONG_ RecursionCount; | |
159 | HANDLE_ OwningThread; | |
160 | HANDLE_ LockSemaphore; | |
161 | ULONG_PTR_ SpinCount; | |
162 | } CRITICAL_SECTION_, *PCRITICAL_SECTION_; | |
163 | ||
20effc67 TL |
164 | #else |
165 | ||
166 | // Windows CE has different layout | |
167 | typedef struct BOOST_MAY_ALIAS CRITICAL_SECTION { | |
168 | unsigned int LockCount; | |
169 | HANDLE OwnerThread; | |
170 | HANDLE hCrit; | |
171 | DWORD needtrap; | |
172 | DWORD dwContentions; | |
173 | } CRITICAL_SECTION_, *LPCRITICAL_SECTION_; | |
174 | ||
175 | #endif | |
176 | ||
7c673cae FG |
177 | #pragma pack(pop) |
178 | ||
b32b8144 | 179 | #if BOOST_WINAPI_PARTITION_APP_SYSTEM |
7c673cae FG |
180 | BOOST_FORCEINLINE VOID_ InitializeCriticalSection(CRITICAL_SECTION_* lpCriticalSection) |
181 | { | |
182 | ::InitializeCriticalSection(winapi::detail::cast_ptr(lpCriticalSection)); | |
183 | } | |
b32b8144 | 184 | #endif |
7c673cae FG |
185 | |
186 | BOOST_FORCEINLINE VOID_ EnterCriticalSection(CRITICAL_SECTION_* lpCriticalSection) | |
187 | { | |
188 | ::EnterCriticalSection(winapi::detail::cast_ptr(lpCriticalSection)); | |
189 | } | |
190 | ||
191 | BOOST_FORCEINLINE VOID_ LeaveCriticalSection(CRITICAL_SECTION_* lpCriticalSection) | |
192 | { | |
193 | ::LeaveCriticalSection(winapi::detail::cast_ptr(lpCriticalSection)); | |
194 | } | |
195 | ||
196 | #if BOOST_USE_WINAPI_VERSION >= 0x0403 | |
b32b8144 | 197 | #if BOOST_WINAPI_PARTITION_APP_SYSTEM |
7c673cae FG |
198 | BOOST_FORCEINLINE BOOL_ InitializeCriticalSectionAndSpinCount(CRITICAL_SECTION_* lpCriticalSection, DWORD_ dwSpinCount) |
199 | { | |
200 | return ::InitializeCriticalSectionAndSpinCount(winapi::detail::cast_ptr(lpCriticalSection), dwSpinCount); | |
201 | } | |
202 | ||
b32b8144 FG |
203 | BOOST_FORCEINLINE DWORD_ SetCriticalSectionSpinCount(CRITICAL_SECTION_* lpCriticalSection, DWORD_ dwSpinCount) |
204 | { | |
205 | return ::SetCriticalSectionSpinCount(winapi::detail::cast_ptr(lpCriticalSection), dwSpinCount); | |
206 | } | |
207 | #endif | |
208 | ||
7c673cae | 209 | // CRITICAL_SECTION_NO_DEBUG_INFO is defined for WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) |
92f5a8d4 TL |
210 | BOOST_CONSTEXPR_OR_CONST DWORD_ CRITICAL_SECTION_NO_DEBUG_INFO_ = 0x01000000; |
211 | BOOST_CONSTEXPR_OR_CONST DWORD_ CRITICAL_SECTION_FLAG_NO_DEBUG_INFO_ = CRITICAL_SECTION_NO_DEBUG_INFO_; | |
212 | BOOST_CONSTEXPR_OR_CONST DWORD_ CRITICAL_SECTION_FLAG_DYNAMIC_SPIN_ = 0x02000000; // undocumented | |
213 | BOOST_CONSTEXPR_OR_CONST DWORD_ CRITICAL_SECTION_FLAG_STATIC_INIT_ = 0x04000000; // undocumented | |
7c673cae FG |
214 | |
215 | #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6 | |
216 | BOOST_FORCEINLINE BOOL_ InitializeCriticalSectionEx(CRITICAL_SECTION_* lpCriticalSection, DWORD_ dwSpinCount, DWORD_ Flags) | |
217 | { | |
218 | return ::InitializeCriticalSectionEx(winapi::detail::cast_ptr(lpCriticalSection), dwSpinCount, Flags); | |
219 | } | |
220 | #endif // BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6 | |
7c673cae FG |
221 | #endif // BOOST_USE_WINAPI_VERSION >= 0x0403 |
222 | ||
223 | #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_NT4 | |
224 | BOOST_FORCEINLINE BOOL_ TryEnterCriticalSection(CRITICAL_SECTION_* lpCriticalSection) | |
225 | { | |
226 | return ::TryEnterCriticalSection(winapi::detail::cast_ptr(lpCriticalSection)); | |
227 | } | |
228 | #endif // BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_NT4 | |
229 | ||
230 | BOOST_FORCEINLINE VOID_ DeleteCriticalSection(CRITICAL_SECTION_* lpCriticalSection) | |
231 | { | |
232 | ::DeleteCriticalSection(winapi::detail::cast_ptr(lpCriticalSection)); | |
233 | } | |
234 | ||
7c673cae FG |
235 | } |
236 | } | |
237 | ||
20effc67 TL |
238 | #include <boost/winapi/detail/footer.hpp> |
239 | ||
b32b8144 | 240 | #endif // BOOST_WINAPI_CRITICAL_SECTION_HPP_INCLUDED_ |