condition_variable.hpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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. #if !defined( BOOST_USE_WINDOWS_H )
  17. extern "C" {
  18. struct _RTL_CONDITION_VARIABLE;
  19. struct _RTL_CRITICAL_SECTION;
  20. struct _RTL_SRWLOCK;
  21. BOOST_SYMBOL_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
  22. InitializeConditionVariable(::_RTL_CONDITION_VARIABLE* ConditionVariable);
  23. BOOST_SYMBOL_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
  24. WakeConditionVariable(::_RTL_CONDITION_VARIABLE* ConditionVariable);
  25. BOOST_SYMBOL_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
  26. WakeAllConditionVariable(::_RTL_CONDITION_VARIABLE* ConditionVariable);
  27. BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
  28. SleepConditionVariableCS(
  29. ::_RTL_CONDITION_VARIABLE* ConditionVariable,
  30. ::_RTL_CRITICAL_SECTION* CriticalSection,
  31. boost::winapi::DWORD_ dwMilliseconds);
  32. BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
  33. SleepConditionVariableSRW(
  34. ::_RTL_CONDITION_VARIABLE* ConditionVariable,
  35. ::_RTL_SRWLOCK* SRWLock,
  36. boost::winapi::DWORD_ dwMilliseconds,
  37. boost::winapi::ULONG_ Flags);
  38. }
  39. #endif
  40. namespace boost {
  41. namespace winapi {
  42. typedef struct BOOST_MAY_ALIAS _RTL_CONDITION_VARIABLE {
  43. PVOID_ Ptr;
  44. } CONDITION_VARIABLE_, *PCONDITION_VARIABLE_;
  45. #if defined( BOOST_USE_WINDOWS_H )
  46. #define BOOST_WINAPI_CONDITION_VARIABLE_INIT CONDITION_VARIABLE_INIT
  47. #else
  48. #define BOOST_WINAPI_CONDITION_VARIABLE_INIT {0}
  49. #endif
  50. struct _RTL_CRITICAL_SECTION;
  51. struct _RTL_SRWLOCK;
  52. BOOST_FORCEINLINE VOID_ InitializeConditionVariable(PCONDITION_VARIABLE_ ConditionVariable)
  53. {
  54. ::InitializeConditionVariable(reinterpret_cast< ::_RTL_CONDITION_VARIABLE* >(ConditionVariable));
  55. }
  56. BOOST_FORCEINLINE VOID_ WakeConditionVariable(PCONDITION_VARIABLE_ ConditionVariable)
  57. {
  58. ::WakeConditionVariable(reinterpret_cast< ::_RTL_CONDITION_VARIABLE* >(ConditionVariable));
  59. }
  60. BOOST_FORCEINLINE VOID_ WakeAllConditionVariable(PCONDITION_VARIABLE_ ConditionVariable)
  61. {
  62. ::WakeAllConditionVariable(reinterpret_cast< ::_RTL_CONDITION_VARIABLE* >(ConditionVariable));
  63. }
  64. BOOST_FORCEINLINE BOOL_ SleepConditionVariableCS(
  65. PCONDITION_VARIABLE_ ConditionVariable,
  66. _RTL_CRITICAL_SECTION* CriticalSection,
  67. DWORD_ dwMilliseconds)
  68. {
  69. return ::SleepConditionVariableCS(
  70. reinterpret_cast< ::_RTL_CONDITION_VARIABLE* >(ConditionVariable),
  71. reinterpret_cast< ::_RTL_CRITICAL_SECTION* >(CriticalSection),
  72. dwMilliseconds);
  73. }
  74. BOOST_FORCEINLINE BOOL_ SleepConditionVariableSRW(
  75. PCONDITION_VARIABLE_ ConditionVariable,
  76. _RTL_SRWLOCK* SRWLock,
  77. DWORD_ dwMilliseconds,
  78. ULONG_ Flags)
  79. {
  80. return ::SleepConditionVariableSRW(
  81. reinterpret_cast< ::_RTL_CONDITION_VARIABLE* >(ConditionVariable),
  82. reinterpret_cast< ::_RTL_SRWLOCK* >(SRWLock),
  83. dwMilliseconds,
  84. Flags);
  85. }
  86. #if defined( BOOST_USE_WINDOWS_H )
  87. BOOST_CONSTEXPR_OR_CONST ULONG_ CONDITION_VARIABLE_LOCKMODE_SHARED_ = CONDITION_VARIABLE_LOCKMODE_SHARED;
  88. #else // defined( BOOST_USE_WINDOWS_H )
  89. BOOST_CONSTEXPR_OR_CONST ULONG_ CONDITION_VARIABLE_LOCKMODE_SHARED_ = 0x00000001;
  90. #endif // defined( BOOST_USE_WINDOWS_H )
  91. BOOST_CONSTEXPR_OR_CONST ULONG_ condition_variable_lockmode_shared = CONDITION_VARIABLE_LOCKMODE_SHARED_;
  92. }
  93. }
  94. #endif // BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
  95. #endif // BOOST_WINAPI_CONDITION_VARIABLE_HPP_INCLUDED_