1 // critical_section.hpp --------------------------------------------------------------//
3 // Copyright 2010 Vicente J. Botet Escriba
4 // Copyright 2015 Andrey Semashev
6 // Distributed under the Boost Software License, Version 1.0.
7 // See http://www.boost.org/LICENSE_1_0.txt
10 #ifndef BOOST_DETAIL_WINAPI_CRITICAL_SECTION_HPP
11 #define BOOST_DETAIL_WINAPI_CRITICAL_SECTION_HPP
13 #include <boost/detail/winapi/basic_types.hpp>
14 #include <boost/detail/winapi/detail/cast_ptr.hpp>
16 #ifdef BOOST_HAS_PRAGMA_ONCE
20 #if !defined( BOOST_USE_WINDOWS_H )
23 #if !defined( BOOST_WINAPI_IS_MINGW )
24 struct _RTL_CRITICAL_SECTION;
26 BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI
27 InitializeCriticalSection(::_RTL_CRITICAL_SECTION* lpCriticalSection);
29 BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI
30 EnterCriticalSection(::_RTL_CRITICAL_SECTION* lpCriticalSection);
32 BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI
33 LeaveCriticalSection(::_RTL_CRITICAL_SECTION* lpCriticalSection);
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);
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);
49 BOOST_SYMBOL_IMPORT boost::detail::winapi::DWORD_ WINAPI
50 SetCriticalSectionSpinCount(
51 ::_RTL_CRITICAL_SECTION* lpCriticalSection,
52 boost::detail::winapi::DWORD_ dwSpinCount);
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);
60 BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI
61 DeleteCriticalSection(::_RTL_CRITICAL_SECTION* lpCriticalSection);
63 #else // defined( BOOST_WINAPI_IS_MINGW )
65 // MinGW uses a different name for the structure
66 struct _CRITICAL_SECTION;
68 BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI
69 InitializeCriticalSection(::_CRITICAL_SECTION* lpCriticalSection);
71 BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI
72 EnterCriticalSection(::_CRITICAL_SECTION* lpCriticalSection);
74 BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI
75 LeaveCriticalSection(::_CRITICAL_SECTION* lpCriticalSection);
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);
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);
91 BOOST_SYMBOL_IMPORT boost::detail::winapi::DWORD_ WINAPI
92 SetCriticalSectionSpinCount(
93 ::_CRITICAL_SECTION* lpCriticalSection,
94 boost::detail::winapi::DWORD_ dwSpinCount);
97 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_NT4
98 BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
99 TryEnterCriticalSection(::_CRITICAL_SECTION* lpCriticalSection);
102 BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI
103 DeleteCriticalSection(::_CRITICAL_SECTION* lpCriticalSection);
105 #endif // defined( BOOST_WINAPI_IS_MINGW )
113 struct _RTL_CRITICAL_SECTION_DEBUG;
115 #pragma pack(push, 8)
117 typedef struct BOOST_DETAIL_WINAPI_MAY_ALIAS _RTL_CRITICAL_SECTION {
118 _RTL_CRITICAL_SECTION_DEBUG* DebugInfo;
120 LONG_ RecursionCount;
121 HANDLE_ OwningThread;
122 HANDLE_ LockSemaphore;
123 ULONG_PTR_ SpinCount;
124 } CRITICAL_SECTION_, *PCRITICAL_SECTION_;
128 BOOST_FORCEINLINE VOID_ InitializeCriticalSection(CRITICAL_SECTION_* lpCriticalSection)
130 ::InitializeCriticalSection(winapi::detail::cast_ptr(lpCriticalSection));
133 BOOST_FORCEINLINE VOID_ EnterCriticalSection(CRITICAL_SECTION_* lpCriticalSection)
135 ::EnterCriticalSection(winapi::detail::cast_ptr(lpCriticalSection));
138 BOOST_FORCEINLINE VOID_ LeaveCriticalSection(CRITICAL_SECTION_* lpCriticalSection)
140 ::LeaveCriticalSection(winapi::detail::cast_ptr(lpCriticalSection));
143 #if BOOST_USE_WINAPI_VERSION >= 0x0403
144 BOOST_FORCEINLINE BOOL_ InitializeCriticalSectionAndSpinCount(CRITICAL_SECTION_* lpCriticalSection, DWORD_ dwSpinCount)
146 return ::InitializeCriticalSectionAndSpinCount(winapi::detail::cast_ptr(lpCriticalSection), dwSpinCount);
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
155 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
156 BOOST_FORCEINLINE BOOL_ InitializeCriticalSectionEx(CRITICAL_SECTION_* lpCriticalSection, DWORD_ dwSpinCount, DWORD_ Flags)
158 return ::InitializeCriticalSectionEx(winapi::detail::cast_ptr(lpCriticalSection), dwSpinCount, Flags);
160 #endif // BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
162 BOOST_FORCEINLINE DWORD_ SetCriticalSectionSpinCount(CRITICAL_SECTION_* lpCriticalSection, DWORD_ dwSpinCount)
164 return ::SetCriticalSectionSpinCount(winapi::detail::cast_ptr(lpCriticalSection), dwSpinCount);
166 #endif // BOOST_USE_WINAPI_VERSION >= 0x0403
168 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_NT4
169 BOOST_FORCEINLINE BOOL_ TryEnterCriticalSection(CRITICAL_SECTION_* lpCriticalSection)
171 return ::TryEnterCriticalSection(winapi::detail::cast_ptr(lpCriticalSection));
173 #endif // BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_NT4
175 BOOST_FORCEINLINE VOID_ DeleteCriticalSection(CRITICAL_SECTION_* lpCriticalSection)
177 ::DeleteCriticalSection(winapi::detail::cast_ptr(lpCriticalSection));
184 #endif // BOOST_DETAIL_WINAPI_CRITICAL_SECTION_HPP