condition_variable.hpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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_CONDITION_VARIABLE_HPP_INCLUDED_
  9. #define BOOST_WINAPI_CONDITION_VARIABLE_HPP_INCLUDED_
  10. #include <boost/winapi/config.hpp>
  11. #ifdef BOOST_HAS_PRAGMA_ONCE
  12. #pragma once
  13. #endif
  14. #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
  15. #include <boost/winapi/basic_types.hpp>
  16. #include <boost/winapi/srw_lock.hpp>
  17. #include <boost/winapi/critical_section.hpp>
  18. #include <boost/winapi/detail/cast_ptr.hpp>
  19. #include <boost/winapi/detail/header.hpp>
  20. #if !defined(BOOST_USE_WINDOWS_H)
  21. extern "C" {
  22. #if !defined(BOOST_WINAPI_IS_MINGW)
  23. struct _RTL_CONDITION_VARIABLE;
  24. namespace boost {
  25. namespace winapi {
  26. namespace detail {
  27. typedef ::_RTL_CONDITION_VARIABLE winsdk_condition_variable;
  28. }
  29. }
  30. }
  31. #else
  32. // Legacy MinGW does not define _RTL_CONDITION_VARIABLE types and instead defines PCONDITION_VARIABLE to PVOID
  33. namespace boost {
  34. namespace winapi {
  35. namespace detail {
  36. typedef VOID_ winsdk_condition_variable;
  37. }
  38. }
  39. }
  40. #endif
  41. BOOST_WINAPI_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
  42. InitializeConditionVariable(boost::winapi::detail::winsdk_condition_variable* ConditionVariable);
  43. BOOST_WINAPI_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
  44. WakeConditionVariable(boost::winapi::detail::winsdk_condition_variable* ConditionVariable);
  45. BOOST_WINAPI_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
  46. WakeAllConditionVariable(boost::winapi::detail::winsdk_condition_variable* ConditionVariable);
  47. BOOST_WINAPI_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
  48. SleepConditionVariableCS(
  49. boost::winapi::detail::winsdk_condition_variable* ConditionVariable,
  50. boost::winapi::detail::winsdk_critical_section* CriticalSection,
  51. boost::winapi::DWORD_ dwMilliseconds);
  52. BOOST_WINAPI_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
  53. SleepConditionVariableSRW(
  54. boost::winapi::detail::winsdk_condition_variable* ConditionVariable,
  55. boost::winapi::detail::winsdk_srwlock* SRWLock,
  56. boost::winapi::DWORD_ dwMilliseconds,
  57. boost::winapi::ULONG_ Flags);
  58. }
  59. #endif
  60. namespace boost {
  61. namespace winapi {
  62. typedef struct BOOST_MAY_ALIAS _RTL_CONDITION_VARIABLE {
  63. PVOID_ Ptr;
  64. } CONDITION_VARIABLE_, *PCONDITION_VARIABLE_;
  65. #if defined(BOOST_USE_WINDOWS_H)
  66. #if !defined(BOOST_WINAPI_IS_MINGW)
  67. #define BOOST_WINAPI_CONDITION_VARIABLE_INIT CONDITION_VARIABLE_INIT
  68. #else
  69. // Legacy MinGW does not define CONDITION_VARIABLE_INIT
  70. #define BOOST_WINAPI_CONDITION_VARIABLE_INIT 0
  71. #endif
  72. #else
  73. #define BOOST_WINAPI_CONDITION_VARIABLE_INIT {0}
  74. #endif
  75. struct _RTL_CRITICAL_SECTION;
  76. struct _RTL_SRWLOCK;
  77. BOOST_FORCEINLINE VOID_ InitializeConditionVariable(PCONDITION_VARIABLE_ ConditionVariable)
  78. {
  79. ::InitializeConditionVariable(winapi::detail::cast_ptr(ConditionVariable));
  80. }
  81. BOOST_FORCEINLINE VOID_ WakeConditionVariable(PCONDITION_VARIABLE_ ConditionVariable)
  82. {
  83. ::WakeConditionVariable(winapi::detail::cast_ptr(ConditionVariable));
  84. }
  85. BOOST_FORCEINLINE VOID_ WakeAllConditionVariable(PCONDITION_VARIABLE_ ConditionVariable)
  86. {
  87. ::WakeAllConditionVariable(winapi::detail::cast_ptr(ConditionVariable));
  88. }
  89. BOOST_FORCEINLINE BOOL_ SleepConditionVariableCS(
  90. PCONDITION_VARIABLE_ ConditionVariable,
  91. _RTL_CRITICAL_SECTION* CriticalSection,
  92. DWORD_ dwMilliseconds)
  93. {
  94. return ::SleepConditionVariableCS(
  95. winapi::detail::cast_ptr(ConditionVariable),
  96. winapi::detail::cast_ptr(CriticalSection),
  97. dwMilliseconds);
  98. }
  99. BOOST_FORCEINLINE BOOL_ SleepConditionVariableSRW(
  100. PCONDITION_VARIABLE_ ConditionVariable,
  101. _RTL_SRWLOCK* SRWLock,
  102. DWORD_ dwMilliseconds,
  103. ULONG_ Flags)
  104. {
  105. return ::SleepConditionVariableSRW(
  106. winapi::detail::cast_ptr(ConditionVariable),
  107. winapi::detail::cast_ptr(SRWLock),
  108. dwMilliseconds,
  109. Flags);
  110. }
  111. // Legacy MinGW does not define CONDITION_VARIABLE_LOCKMODE_SHARED
  112. #if defined(BOOST_USE_WINDOWS_H) && !defined(BOOST_WINAPI_IS_MINGW)
  113. BOOST_CONSTEXPR_OR_CONST ULONG_ CONDITION_VARIABLE_LOCKMODE_SHARED_ = CONDITION_VARIABLE_LOCKMODE_SHARED;
  114. #else
  115. BOOST_CONSTEXPR_OR_CONST ULONG_ CONDITION_VARIABLE_LOCKMODE_SHARED_ = 0x00000001;
  116. #endif
  117. BOOST_CONSTEXPR_OR_CONST ULONG_ condition_variable_lockmode_shared = CONDITION_VARIABLE_LOCKMODE_SHARED_;
  118. }
  119. }
  120. #include <boost/winapi/detail/footer.hpp>
  121. #endif // BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
  122. #endif // BOOST_WINAPI_CONDITION_VARIABLE_HPP_INCLUDED_