]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/winapi/include/boost/detail/winapi/critical_section.hpp
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / winapi / include / boost / detail / winapi / critical_section.hpp
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