srw_lock.hpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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_SRW_LOCK_HPP_INCLUDED_
  9. #define BOOST_WINAPI_SRW_LOCK_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. || (defined(_MSC_VER) && _MSC_VER < 1600)
  16. // Windows SDK 6.0A, which is used by MSVC 9, does not have TryAcquireSRWLock* neither in headers nor in .lib files,
  17. // although the functions are present in later SDKs since Windows API version 6.
  18. #define BOOST_WINAPI_NO_TRY_ACQUIRE_SRWLOCK
  19. #endif
  20. #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
  21. #include <boost/winapi/basic_types.hpp>
  22. #include <boost/winapi/detail/cast_ptr.hpp>
  23. #include <boost/winapi/detail/header.hpp>
  24. #if !defined(BOOST_USE_WINDOWS_H)
  25. extern "C" {
  26. #if !defined(BOOST_WINAPI_IS_MINGW)
  27. struct _RTL_SRWLOCK;
  28. namespace boost {
  29. namespace winapi {
  30. namespace detail {
  31. typedef ::_RTL_SRWLOCK winsdk_srwlock;
  32. }
  33. }
  34. }
  35. #else
  36. // Legacy MinGW does not define _RTL_SRWLOCK type and instead defines PSRWLOCK to PVOID
  37. namespace boost {
  38. namespace winapi {
  39. namespace detail {
  40. typedef VOID_ winsdk_srwlock;
  41. }
  42. }
  43. }
  44. #endif
  45. BOOST_WINAPI_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
  46. InitializeSRWLock(boost::winapi::detail::winsdk_srwlock* SRWLock);
  47. BOOST_WINAPI_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
  48. ReleaseSRWLockExclusive(boost::winapi::detail::winsdk_srwlock* SRWLock);
  49. BOOST_WINAPI_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
  50. ReleaseSRWLockShared(boost::winapi::detail::winsdk_srwlock* SRWLock);
  51. BOOST_WINAPI_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
  52. AcquireSRWLockExclusive(boost::winapi::detail::winsdk_srwlock* SRWLock);
  53. BOOST_WINAPI_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
  54. AcquireSRWLockShared(boost::winapi::detail::winsdk_srwlock* SRWLock);
  55. #if !defined( BOOST_WINAPI_NO_TRY_ACQUIRE_SRWLOCK )
  56. BOOST_WINAPI_IMPORT boost::winapi::BOOLEAN_ BOOST_WINAPI_WINAPI_CC
  57. TryAcquireSRWLockExclusive(boost::winapi::detail::winsdk_srwlock* SRWLock);
  58. BOOST_WINAPI_IMPORT boost::winapi::BOOLEAN_ BOOST_WINAPI_WINAPI_CC
  59. TryAcquireSRWLockShared(boost::winapi::detail::winsdk_srwlock* SRWLock);
  60. #endif
  61. } // extern "C"
  62. #endif
  63. namespace boost {
  64. namespace winapi {
  65. typedef struct BOOST_MAY_ALIAS _RTL_SRWLOCK {
  66. PVOID_ Ptr;
  67. } SRWLOCK_, *PSRWLOCK_;
  68. #if defined(BOOST_USE_WINDOWS_H)
  69. #if !defined(BOOST_WINAPI_IS_MINGW)
  70. #define BOOST_WINAPI_SRWLOCK_INIT SRWLOCK_INIT
  71. #else
  72. // Legacy MinGW does not define SRWLOCK_INIT
  73. #define BOOST_WINAPI_SRWLOCK_INIT 0
  74. #endif
  75. #else
  76. #define BOOST_WINAPI_SRWLOCK_INIT {0}
  77. #endif
  78. BOOST_FORCEINLINE VOID_ InitializeSRWLock(PSRWLOCK_ SRWLock)
  79. {
  80. ::InitializeSRWLock(winapi::detail::cast_ptr(SRWLock));
  81. }
  82. BOOST_FORCEINLINE VOID_ ReleaseSRWLockExclusive(PSRWLOCK_ SRWLock)
  83. {
  84. ::ReleaseSRWLockExclusive(winapi::detail::cast_ptr(SRWLock));
  85. }
  86. BOOST_FORCEINLINE VOID_ ReleaseSRWLockShared(PSRWLOCK_ SRWLock)
  87. {
  88. ::ReleaseSRWLockShared(winapi::detail::cast_ptr(SRWLock));
  89. }
  90. BOOST_FORCEINLINE VOID_ AcquireSRWLockExclusive(PSRWLOCK_ SRWLock)
  91. {
  92. ::AcquireSRWLockExclusive(winapi::detail::cast_ptr(SRWLock));
  93. }
  94. BOOST_FORCEINLINE VOID_ AcquireSRWLockShared(PSRWLOCK_ SRWLock)
  95. {
  96. ::AcquireSRWLockShared(winapi::detail::cast_ptr(SRWLock));
  97. }
  98. #if !defined(BOOST_WINAPI_NO_TRY_ACQUIRE_SRWLOCK)
  99. BOOST_FORCEINLINE BOOLEAN_ TryAcquireSRWLockExclusive(PSRWLOCK_ SRWLock)
  100. {
  101. return ::TryAcquireSRWLockExclusive(winapi::detail::cast_ptr(SRWLock));
  102. }
  103. BOOST_FORCEINLINE BOOLEAN_ TryAcquireSRWLockShared(PSRWLOCK_ SRWLock)
  104. {
  105. return ::TryAcquireSRWLockShared(winapi::detail::cast_ptr(SRWLock));
  106. }
  107. #endif
  108. }
  109. }
  110. #include <boost/winapi/detail/footer.hpp>
  111. #endif // BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
  112. #endif // BOOST_WINAPI_SRW_LOCK_HPP_INCLUDED_