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_CRITICAL_SECTION_HPP_INCLUDED_
10 #define BOOST_WINAPI_CRITICAL_SECTION_HPP_INCLUDED_
11
12 #include <boost/winapi/basic_types.hpp>
13 #include <boost/winapi/detail/cast_ptr.hpp>
14 #include <boost/winapi/detail/header.hpp>
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 )
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
36 struct _RTL_CRITICAL_SECTION;
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 )
60
61 #if BOOST_WINAPI_PARTITION_APP_SYSTEM
62 BOOST_WINAPI_IMPORT_EXCEPT_WM boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
63 InitializeCriticalSection(boost::winapi::detail::winsdk_critical_section* lpCriticalSection);
64 #endif
65
66 BOOST_WINAPI_IMPORT_EXCEPT_WM boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
67 EnterCriticalSection(boost::winapi::detail::winsdk_critical_section* lpCriticalSection);
68
69 BOOST_WINAPI_IMPORT_EXCEPT_WM boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
70 LeaveCriticalSection(boost::winapi::detail::winsdk_critical_section* lpCriticalSection);
71
72 #if BOOST_USE_WINAPI_VERSION >= 0x0403
73 #if BOOST_WINAPI_PARTITION_APP_SYSTEM
74 BOOST_WINAPI_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
75 InitializeCriticalSectionAndSpinCount(
76 boost::winapi::detail::winsdk_critical_section* lpCriticalSection,
77 boost::winapi::DWORD_ dwSpinCount);
78
79 BOOST_WINAPI_IMPORT boost::winapi::DWORD_ BOOST_WINAPI_WINAPI_CC
80 SetCriticalSectionSpinCount(
81 boost::winapi::detail::winsdk_critical_section* lpCriticalSection,
82 boost::winapi::DWORD_ dwSpinCount);
83 #endif
84
85 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
86 BOOST_WINAPI_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
87 InitializeCriticalSectionEx(
88 boost::winapi::detail::winsdk_critical_section* lpCriticalSection,
89 boost::winapi::DWORD_ dwSpinCount,
90 boost::winapi::DWORD_ Flags);
91 #endif
92 #endif
93
94 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_NT4
95 BOOST_WINAPI_IMPORT_EXCEPT_WM boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
96 TryEnterCriticalSection(boost::winapi::detail::winsdk_critical_section* lpCriticalSection);
97 #endif
98
99 BOOST_WINAPI_IMPORT_EXCEPT_WM boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
100 DeleteCriticalSection(boost::winapi::detail::winsdk_critical_section* lpCriticalSection);
101
102 #else // defined( BOOST_WINAPI_IS_MINGW )
103
104 BOOST_WINAPI_IMPORT_EXCEPT_WM boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
105 InitializeCriticalSection(boost::winapi::detail::winapi_critical_section* lpCriticalSection);
106
107 BOOST_WINAPI_IMPORT_EXCEPT_WM boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
108 EnterCriticalSection(boost::winapi::detail::winapi_critical_section* lpCriticalSection);
109
110 BOOST_WINAPI_IMPORT_EXCEPT_WM boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
111 LeaveCriticalSection(boost::winapi::detail::winapi_critical_section* lpCriticalSection);
112
113 #if BOOST_USE_WINAPI_VERSION >= 0x0403
114 BOOST_WINAPI_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
115 InitializeCriticalSectionAndSpinCount(
116 boost::winapi::detail::winapi_critical_section* lpCriticalSection,
117 boost::winapi::DWORD_ dwSpinCount);
118
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
125 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
126 BOOST_WINAPI_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
127 InitializeCriticalSectionEx(
128 boost::winapi::detail::winapi_critical_section* lpCriticalSection,
129 boost::winapi::DWORD_ dwSpinCount,
130 boost::winapi::DWORD_ Flags);
131 #endif
132
133 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_NT4
134 BOOST_WINAPI_IMPORT_EXCEPT_WM boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
135 TryEnterCriticalSection(boost::winapi::detail::winapi_critical_section* lpCriticalSection);
136 #endif
137
138 BOOST_WINAPI_IMPORT_EXCEPT_WM boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
139 DeleteCriticalSection(boost::winapi::detail::winapi_critical_section* lpCriticalSection);
140
141 #endif // defined( BOOST_WINAPI_IS_MINGW )
142 } // extern "C"
143 #endif
144
145 namespace boost {
146 namespace winapi {
147
148
149 #pragma pack(push, 8)
150
151 #if !defined(_WIN32_WCE)
152
153 struct _RTL_CRITICAL_SECTION_DEBUG;
154
155 typedef struct BOOST_MAY_ALIAS _RTL_CRITICAL_SECTION {
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
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
177 #pragma pack(pop)
178
179 #if BOOST_WINAPI_PARTITION_APP_SYSTEM
InitializeCriticalSection(CRITICAL_SECTION_ * lpCriticalSection)180 BOOST_FORCEINLINE VOID_ InitializeCriticalSection(CRITICAL_SECTION_* lpCriticalSection)
181 {
182 ::InitializeCriticalSection(winapi::detail::cast_ptr(lpCriticalSection));
183 }
184 #endif
185
EnterCriticalSection(CRITICAL_SECTION_ * lpCriticalSection)186 BOOST_FORCEINLINE VOID_ EnterCriticalSection(CRITICAL_SECTION_* lpCriticalSection)
187 {
188 ::EnterCriticalSection(winapi::detail::cast_ptr(lpCriticalSection));
189 }
190
LeaveCriticalSection(CRITICAL_SECTION_ * lpCriticalSection)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
197 #if BOOST_WINAPI_PARTITION_APP_SYSTEM
InitializeCriticalSectionAndSpinCount(CRITICAL_SECTION_ * lpCriticalSection,DWORD_ dwSpinCount)198 BOOST_FORCEINLINE BOOL_ InitializeCriticalSectionAndSpinCount(CRITICAL_SECTION_* lpCriticalSection, DWORD_ dwSpinCount)
199 {
200 return ::InitializeCriticalSectionAndSpinCount(winapi::detail::cast_ptr(lpCriticalSection), dwSpinCount);
201 }
202
SetCriticalSectionSpinCount(CRITICAL_SECTION_ * lpCriticalSection,DWORD_ dwSpinCount)203 BOOST_FORCEINLINE DWORD_ SetCriticalSectionSpinCount(CRITICAL_SECTION_* lpCriticalSection, DWORD_ dwSpinCount)
204 {
205 return ::SetCriticalSectionSpinCount(winapi::detail::cast_ptr(lpCriticalSection), dwSpinCount);
206 }
207 #endif
208
209 // CRITICAL_SECTION_NO_DEBUG_INFO is defined for WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
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
214
215 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
InitializeCriticalSectionEx(CRITICAL_SECTION_ * lpCriticalSection,DWORD_ dwSpinCount,DWORD_ Flags)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
221 #endif // BOOST_USE_WINAPI_VERSION >= 0x0403
222
223 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_NT4
TryEnterCriticalSection(CRITICAL_SECTION_ * lpCriticalSection)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
DeleteCriticalSection(CRITICAL_SECTION_ * lpCriticalSection)230 BOOST_FORCEINLINE VOID_ DeleteCriticalSection(CRITICAL_SECTION_* lpCriticalSection)
231 {
232 ::DeleteCriticalSection(winapi::detail::cast_ptr(lpCriticalSection));
233 }
234
235 }
236 }
237
238 #include <boost/winapi/detail/footer.hpp>
239
240 #endif // BOOST_WINAPI_CRITICAL_SECTION_HPP_INCLUDED_
241