]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // critical_section.hpp --------------------------------------------------------------// |
2 | ||
3 | // Copyright 2010 Vicente J. Botet Escriba | |
4 | // Copyright 2015 Andrey Semashev | |
5 | ||
6 | // Distributed under the Boost Software License, Version 1.0. | |
7 | // See http://www.boost.org/LICENSE_1_0.txt | |
8 | ||
9 | ||
10 | #ifndef BOOST_DETAIL_WINAPI_CRITICAL_SECTION_HPP | |
11 | #define BOOST_DETAIL_WINAPI_CRITICAL_SECTION_HPP | |
12 | ||
13 | #include <boost/detail/winapi/basic_types.hpp> | |
14 | #include <boost/detail/winapi/detail/cast_ptr.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 | struct _RTL_CRITICAL_SECTION; | |
25 | ||
26 | BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI | |
27 | InitializeCriticalSection(::_RTL_CRITICAL_SECTION* lpCriticalSection); | |
28 | ||
29 | BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI | |
30 | EnterCriticalSection(::_RTL_CRITICAL_SECTION* lpCriticalSection); | |
31 | ||
32 | BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI | |
33 | LeaveCriticalSection(::_RTL_CRITICAL_SECTION* lpCriticalSection); | |
34 | ||
35 | #if BOOST_USE_WINAPI_VERSION >= 0x0403 | |
36 | BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI | |
37 | InitializeCriticalSectionAndSpinCount( | |
38 | ::_RTL_CRITICAL_SECTION* lpCriticalSection, | |
39 | boost::detail::winapi::DWORD_ dwSpinCount); | |
40 | ||
41 | #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6 | |
42 | BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI | |
43 | InitializeCriticalSectionEx( | |
44 | ::_RTL_CRITICAL_SECTION* lpCriticalSection, | |
45 | boost::detail::winapi::DWORD_ dwSpinCount, | |
46 | boost::detail::winapi::DWORD_ Flags); | |
47 | #endif | |
48 | ||
49 | BOOST_SYMBOL_IMPORT boost::detail::winapi::DWORD_ WINAPI | |
50 | SetCriticalSectionSpinCount( | |
51 | ::_RTL_CRITICAL_SECTION* lpCriticalSection, | |
52 | boost::detail::winapi::DWORD_ dwSpinCount); | |
53 | #endif | |
54 | ||
55 | #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_NT4 | |
56 | BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI | |
57 | TryEnterCriticalSection(::_RTL_CRITICAL_SECTION* lpCriticalSection); | |
58 | #endif | |
59 | ||
60 | BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI | |
61 | DeleteCriticalSection(::_RTL_CRITICAL_SECTION* lpCriticalSection); | |
62 | ||
63 | #else // defined( BOOST_WINAPI_IS_MINGW ) | |
64 | ||
65 | // MinGW uses a different name for the structure | |
66 | struct _CRITICAL_SECTION; | |
67 | ||
68 | BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI | |
69 | InitializeCriticalSection(::_CRITICAL_SECTION* lpCriticalSection); | |
70 | ||
71 | BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI | |
72 | EnterCriticalSection(::_CRITICAL_SECTION* lpCriticalSection); | |
73 | ||
74 | BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI | |
75 | LeaveCriticalSection(::_CRITICAL_SECTION* lpCriticalSection); | |
76 | ||
77 | #if BOOST_USE_WINAPI_VERSION >= 0x0403 | |
78 | BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI | |
79 | InitializeCriticalSectionAndSpinCount( | |
80 | ::_CRITICAL_SECTION* lpCriticalSection, | |
81 | boost::detail::winapi::DWORD_ dwSpinCount); | |
82 | ||
83 | #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6 | |
84 | BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI | |
85 | InitializeCriticalSectionEx( | |
86 | ::_CRITICAL_SECTION* lpCriticalSection, | |
87 | boost::detail::winapi::DWORD_ dwSpinCount, | |
88 | boost::detail::winapi::DWORD_ Flags); | |
89 | #endif | |
90 | ||
91 | BOOST_SYMBOL_IMPORT boost::detail::winapi::DWORD_ WINAPI | |
92 | SetCriticalSectionSpinCount( | |
93 | ::_CRITICAL_SECTION* lpCriticalSection, | |
94 | boost::detail::winapi::DWORD_ dwSpinCount); | |
95 | #endif | |
96 | ||
97 | #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_NT4 | |
98 | BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI | |
99 | TryEnterCriticalSection(::_CRITICAL_SECTION* lpCriticalSection); | |
100 | #endif | |
101 | ||
102 | BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI | |
103 | DeleteCriticalSection(::_CRITICAL_SECTION* lpCriticalSection); | |
104 | ||
105 | #endif // defined( BOOST_WINAPI_IS_MINGW ) | |
106 | } | |
107 | #endif | |
108 | ||
109 | namespace boost { | |
110 | namespace detail { | |
111 | namespace winapi { | |
112 | ||
113 | struct _RTL_CRITICAL_SECTION_DEBUG; | |
114 | ||
115 | #pragma pack(push, 8) | |
116 | ||
117 | typedef struct BOOST_DETAIL_WINAPI_MAY_ALIAS _RTL_CRITICAL_SECTION { | |
118 | _RTL_CRITICAL_SECTION_DEBUG* DebugInfo; | |
119 | LONG_ LockCount; | |
120 | LONG_ RecursionCount; | |
121 | HANDLE_ OwningThread; | |
122 | HANDLE_ LockSemaphore; | |
123 | ULONG_PTR_ SpinCount; | |
124 | } CRITICAL_SECTION_, *PCRITICAL_SECTION_; | |
125 | ||
126 | #pragma pack(pop) | |
127 | ||
128 | BOOST_FORCEINLINE VOID_ InitializeCriticalSection(CRITICAL_SECTION_* lpCriticalSection) | |
129 | { | |
130 | ::InitializeCriticalSection(winapi::detail::cast_ptr(lpCriticalSection)); | |
131 | } | |
132 | ||
133 | BOOST_FORCEINLINE VOID_ EnterCriticalSection(CRITICAL_SECTION_* lpCriticalSection) | |
134 | { | |
135 | ::EnterCriticalSection(winapi::detail::cast_ptr(lpCriticalSection)); | |
136 | } | |
137 | ||
138 | BOOST_FORCEINLINE VOID_ LeaveCriticalSection(CRITICAL_SECTION_* lpCriticalSection) | |
139 | { | |
140 | ::LeaveCriticalSection(winapi::detail::cast_ptr(lpCriticalSection)); | |
141 | } | |
142 | ||
143 | #if BOOST_USE_WINAPI_VERSION >= 0x0403 | |
144 | BOOST_FORCEINLINE BOOL_ InitializeCriticalSectionAndSpinCount(CRITICAL_SECTION_* lpCriticalSection, DWORD_ dwSpinCount) | |
145 | { | |
146 | return ::InitializeCriticalSectionAndSpinCount(winapi::detail::cast_ptr(lpCriticalSection), dwSpinCount); | |
147 | } | |
148 | ||
149 | // CRITICAL_SECTION_NO_DEBUG_INFO is defined for WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) | |
150 | const DWORD_ CRITICAL_SECTION_NO_DEBUG_INFO_ = 0x01000000; | |
151 | const DWORD_ CRITICAL_SECTION_FLAG_NO_DEBUG_INFO_ = CRITICAL_SECTION_NO_DEBUG_INFO_; | |
152 | const DWORD_ CRITICAL_SECTION_FLAG_DYNAMIC_SPIN_ = 0x02000000; // undocumented | |
153 | const DWORD_ CRITICAL_SECTION_FLAG_STATIC_INIT_ = 0x04000000; // undocumented | |
154 | ||
155 | #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6 | |
156 | BOOST_FORCEINLINE BOOL_ InitializeCriticalSectionEx(CRITICAL_SECTION_* lpCriticalSection, DWORD_ dwSpinCount, DWORD_ Flags) | |
157 | { | |
158 | return ::InitializeCriticalSectionEx(winapi::detail::cast_ptr(lpCriticalSection), dwSpinCount, Flags); | |
159 | } | |
160 | #endif // BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6 | |
161 | ||
162 | BOOST_FORCEINLINE DWORD_ SetCriticalSectionSpinCount(CRITICAL_SECTION_* lpCriticalSection, DWORD_ dwSpinCount) | |
163 | { | |
164 | return ::SetCriticalSectionSpinCount(winapi::detail::cast_ptr(lpCriticalSection), dwSpinCount); | |
165 | } | |
166 | #endif // BOOST_USE_WINAPI_VERSION >= 0x0403 | |
167 | ||
168 | #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_NT4 | |
169 | BOOST_FORCEINLINE BOOL_ TryEnterCriticalSection(CRITICAL_SECTION_* lpCriticalSection) | |
170 | { | |
171 | return ::TryEnterCriticalSection(winapi::detail::cast_ptr(lpCriticalSection)); | |
172 | } | |
173 | #endif // BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_NT4 | |
174 | ||
175 | BOOST_FORCEINLINE VOID_ DeleteCriticalSection(CRITICAL_SECTION_* lpCriticalSection) | |
176 | { | |
177 | ::DeleteCriticalSection(winapi::detail::cast_ptr(lpCriticalSection)); | |
178 | } | |
179 | ||
180 | } | |
181 | } | |
182 | } | |
183 | ||
184 | #endif // BOOST_DETAIL_WINAPI_CRITICAL_SECTION_HPP |