srw_lock.hpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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. #if !defined( BOOST_USE_WINDOWS_H )
  23. extern "C" {
  24. struct _RTL_SRWLOCK;
  25. BOOST_SYMBOL_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
  26. InitializeSRWLock(::_RTL_SRWLOCK* SRWLock);
  27. BOOST_SYMBOL_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
  28. ReleaseSRWLockExclusive(::_RTL_SRWLOCK* SRWLock);
  29. BOOST_SYMBOL_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
  30. ReleaseSRWLockShared(::_RTL_SRWLOCK* SRWLock);
  31. BOOST_SYMBOL_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
  32. AcquireSRWLockExclusive(::_RTL_SRWLOCK* SRWLock);
  33. BOOST_SYMBOL_IMPORT boost::winapi::VOID_ BOOST_WINAPI_WINAPI_CC
  34. AcquireSRWLockShared(::_RTL_SRWLOCK* SRWLock);
  35. #if !defined( BOOST_WINAPI_NO_TRY_ACQUIRE_SRWLOCK )
  36. BOOST_SYMBOL_IMPORT boost::winapi::BOOLEAN_ BOOST_WINAPI_WINAPI_CC
  37. TryAcquireSRWLockExclusive(::_RTL_SRWLOCK* SRWLock);
  38. BOOST_SYMBOL_IMPORT boost::winapi::BOOLEAN_ BOOST_WINAPI_WINAPI_CC
  39. TryAcquireSRWLockShared(::_RTL_SRWLOCK* SRWLock);
  40. #endif
  41. } // extern "C"
  42. #endif
  43. namespace boost {
  44. namespace winapi {
  45. typedef struct BOOST_MAY_ALIAS _RTL_SRWLOCK {
  46. PVOID_ Ptr;
  47. } SRWLOCK_, *PSRWLOCK_;
  48. #if defined( BOOST_USE_WINDOWS_H )
  49. #define BOOST_WINAPI_SRWLOCK_INIT SRWLOCK_INIT
  50. #else
  51. #define BOOST_WINAPI_SRWLOCK_INIT {0}
  52. #endif
  53. BOOST_FORCEINLINE VOID_ InitializeSRWLock(PSRWLOCK_ SRWLock)
  54. {
  55. ::InitializeSRWLock(reinterpret_cast< ::_RTL_SRWLOCK* >(SRWLock));
  56. }
  57. BOOST_FORCEINLINE VOID_ ReleaseSRWLockExclusive(PSRWLOCK_ SRWLock)
  58. {
  59. ::ReleaseSRWLockExclusive(reinterpret_cast< ::_RTL_SRWLOCK* >(SRWLock));
  60. }
  61. BOOST_FORCEINLINE VOID_ ReleaseSRWLockShared(PSRWLOCK_ SRWLock)
  62. {
  63. ::ReleaseSRWLockShared(reinterpret_cast< ::_RTL_SRWLOCK* >(SRWLock));
  64. }
  65. BOOST_FORCEINLINE VOID_ AcquireSRWLockExclusive(PSRWLOCK_ SRWLock)
  66. {
  67. ::AcquireSRWLockExclusive(reinterpret_cast< ::_RTL_SRWLOCK* >(SRWLock));
  68. }
  69. BOOST_FORCEINLINE VOID_ AcquireSRWLockShared(PSRWLOCK_ SRWLock)
  70. {
  71. ::AcquireSRWLockShared(reinterpret_cast< ::_RTL_SRWLOCK* >(SRWLock));
  72. }
  73. #if !defined( BOOST_WINAPI_NO_TRY_ACQUIRE_SRWLOCK )
  74. BOOST_FORCEINLINE BOOLEAN_ TryAcquireSRWLockExclusive(PSRWLOCK_ SRWLock)
  75. {
  76. return ::TryAcquireSRWLockExclusive(reinterpret_cast< ::_RTL_SRWLOCK* >(SRWLock));
  77. }
  78. BOOST_FORCEINLINE BOOLEAN_ TryAcquireSRWLockShared(PSRWLOCK_ SRWLock)
  79. {
  80. return ::TryAcquireSRWLockShared(reinterpret_cast< ::_RTL_SRWLOCK* >(SRWLock));
  81. }
  82. #endif
  83. }
  84. }
  85. #endif // BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
  86. #endif // BOOST_WINAPI_SRW_LOCK_HPP_INCLUDED_