critical_section.hpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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. #ifndef BOOST_WINAPI_CRITICAL_SECTION_HPP_INCLUDED_
  9. #define BOOST_WINAPI_CRITICAL_SECTION_HPP_INCLUDED_
  10. #include <boost/winapi/basic_types.hpp>
  11. #include <boost/winapi/detail/cast_ptr.hpp>
  12. #ifdef BOOST_HAS_PRAGMA_ONCE
  13. #pragma once
  14. #endif
  15. #if !defined( BOOST_USE_WINDOWS_H )
  16. extern "C" {
  17. #if !defined( BOOST_WINAPI_IS_MINGW )
  18. struct _RTL_CRITICAL_SECTION;
  19. #if BOOST_WINAPI_PARTITION_APP_SYSTEM
  20. BOOST_SYMBOL_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
  21. InitializeCriticalSection(::_RTL_CRITICAL_SECTION* lpCriticalSection);
  22. #endif
  23. BOOST_SYMBOL_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
  24. EnterCriticalSection(::_RTL_CRITICAL_SECTION* lpCriticalSection);
  25. BOOST_SYMBOL_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
  26. LeaveCriticalSection(::_RTL_CRITICAL_SECTION* lpCriticalSection);
  27. #if BOOST_USE_WINAPI_VERSION >= 0x0403
  28. #if BOOST_WINAPI_PARTITION_APP_SYSTEM
  29. BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
  30. InitializeCriticalSectionAndSpinCount(
  31. ::_RTL_CRITICAL_SECTION* lpCriticalSection,
  32. boost::winapi::DWORD_ dwSpinCount);
  33. BOOST_SYMBOL_IMPORT boost::winapi::DWORD_ BOOST_WINAPI_WINAPI_CC
  34. SetCriticalSectionSpinCount(
  35. ::_RTL_CRITICAL_SECTION* lpCriticalSection,
  36. boost::winapi::DWORD_ dwSpinCount);
  37. #endif
  38. #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
  39. BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
  40. InitializeCriticalSectionEx(
  41. ::_RTL_CRITICAL_SECTION* lpCriticalSection,
  42. boost::winapi::DWORD_ dwSpinCount,
  43. boost::winapi::DWORD_ Flags);
  44. #endif
  45. #endif
  46. #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_NT4
  47. BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
  48. TryEnterCriticalSection(::_RTL_CRITICAL_SECTION* lpCriticalSection);
  49. #endif
  50. BOOST_SYMBOL_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
  51. DeleteCriticalSection(::_RTL_CRITICAL_SECTION* lpCriticalSection);
  52. #else // defined( BOOST_WINAPI_IS_MINGW )
  53. // MinGW uses a different name for the structure
  54. struct _CRITICAL_SECTION;
  55. BOOST_SYMBOL_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
  56. InitializeCriticalSection(::_CRITICAL_SECTION* lpCriticalSection);
  57. BOOST_SYMBOL_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
  58. EnterCriticalSection(::_CRITICAL_SECTION* lpCriticalSection);
  59. BOOST_SYMBOL_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
  60. LeaveCriticalSection(::_CRITICAL_SECTION* lpCriticalSection);
  61. #if BOOST_USE_WINAPI_VERSION >= 0x0403
  62. BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
  63. InitializeCriticalSectionAndSpinCount(
  64. ::_CRITICAL_SECTION* lpCriticalSection,
  65. boost::winapi::DWORD_ dwSpinCount);
  66. #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
  67. BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
  68. InitializeCriticalSectionEx(
  69. ::_CRITICAL_SECTION* lpCriticalSection,
  70. boost::winapi::DWORD_ dwSpinCount,
  71. boost::winapi::DWORD_ Flags);
  72. #endif
  73. BOOST_SYMBOL_IMPORT boost::winapi::DWORD_ BOOST_WINAPI_WINAPI_CC
  74. SetCriticalSectionSpinCount(
  75. ::_CRITICAL_SECTION* lpCriticalSection,
  76. boost::winapi::DWORD_ dwSpinCount);
  77. #endif
  78. #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_NT4
  79. BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
  80. TryEnterCriticalSection(::_CRITICAL_SECTION* lpCriticalSection);
  81. #endif
  82. BOOST_SYMBOL_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
  83. DeleteCriticalSection(::_CRITICAL_SECTION* lpCriticalSection);
  84. #endif // defined( BOOST_WINAPI_IS_MINGW )
  85. } // extern "C"
  86. #endif
  87. namespace boost {
  88. namespace winapi {
  89. struct _RTL_CRITICAL_SECTION_DEBUG;
  90. #pragma pack(push, 8)
  91. typedef struct BOOST_MAY_ALIAS _RTL_CRITICAL_SECTION {
  92. _RTL_CRITICAL_SECTION_DEBUG* DebugInfo;
  93. LONG_ LockCount;
  94. LONG_ RecursionCount;
  95. HANDLE_ OwningThread;
  96. HANDLE_ LockSemaphore;
  97. ULONG_PTR_ SpinCount;
  98. } CRITICAL_SECTION_, *PCRITICAL_SECTION_;
  99. #pragma pack(pop)
  100. #if BOOST_WINAPI_PARTITION_APP_SYSTEM
  101. BOOST_FORCEINLINE VOID_ InitializeCriticalSection(CRITICAL_SECTION_* lpCriticalSection)
  102. {
  103. ::InitializeCriticalSection(winapi::detail::cast_ptr(lpCriticalSection));
  104. }
  105. #endif
  106. BOOST_FORCEINLINE VOID_ EnterCriticalSection(CRITICAL_SECTION_* lpCriticalSection)
  107. {
  108. ::EnterCriticalSection(winapi::detail::cast_ptr(lpCriticalSection));
  109. }
  110. BOOST_FORCEINLINE VOID_ LeaveCriticalSection(CRITICAL_SECTION_* lpCriticalSection)
  111. {
  112. ::LeaveCriticalSection(winapi::detail::cast_ptr(lpCriticalSection));
  113. }
  114. #if BOOST_USE_WINAPI_VERSION >= 0x0403
  115. #if BOOST_WINAPI_PARTITION_APP_SYSTEM
  116. BOOST_FORCEINLINE BOOL_ InitializeCriticalSectionAndSpinCount(CRITICAL_SECTION_* lpCriticalSection, DWORD_ dwSpinCount)
  117. {
  118. return ::InitializeCriticalSectionAndSpinCount(winapi::detail::cast_ptr(lpCriticalSection), dwSpinCount);
  119. }
  120. BOOST_FORCEINLINE DWORD_ SetCriticalSectionSpinCount(CRITICAL_SECTION_* lpCriticalSection, DWORD_ dwSpinCount)
  121. {
  122. return ::SetCriticalSectionSpinCount(winapi::detail::cast_ptr(lpCriticalSection), dwSpinCount);
  123. }
  124. #endif
  125. // CRITICAL_SECTION_NO_DEBUG_INFO is defined for WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
  126. BOOST_CONSTEXPR_OR_CONST DWORD_ CRITICAL_SECTION_NO_DEBUG_INFO_ = 0x01000000;
  127. BOOST_CONSTEXPR_OR_CONST DWORD_ CRITICAL_SECTION_FLAG_NO_DEBUG_INFO_ = CRITICAL_SECTION_NO_DEBUG_INFO_;
  128. BOOST_CONSTEXPR_OR_CONST DWORD_ CRITICAL_SECTION_FLAG_DYNAMIC_SPIN_ = 0x02000000; // undocumented
  129. BOOST_CONSTEXPR_OR_CONST DWORD_ CRITICAL_SECTION_FLAG_STATIC_INIT_ = 0x04000000; // undocumented
  130. #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
  131. BOOST_FORCEINLINE BOOL_ InitializeCriticalSectionEx(CRITICAL_SECTION_* lpCriticalSection, DWORD_ dwSpinCount, DWORD_ Flags)
  132. {
  133. return ::InitializeCriticalSectionEx(winapi::detail::cast_ptr(lpCriticalSection), dwSpinCount, Flags);
  134. }
  135. #endif // BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
  136. #endif // BOOST_USE_WINAPI_VERSION >= 0x0403
  137. #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_NT4
  138. BOOST_FORCEINLINE BOOL_ TryEnterCriticalSection(CRITICAL_SECTION_* lpCriticalSection)
  139. {
  140. return ::TryEnterCriticalSection(winapi::detail::cast_ptr(lpCriticalSection));
  141. }
  142. #endif // BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_NT4
  143. BOOST_FORCEINLINE VOID_ DeleteCriticalSection(CRITICAL_SECTION_* lpCriticalSection)
  144. {
  145. ::DeleteCriticalSection(winapi::detail::cast_ptr(lpCriticalSection));
  146. }
  147. }
  148. }
  149. #endif // BOOST_WINAPI_CRITICAL_SECTION_HPP_INCLUDED_