semaphore.hpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  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_SEMAPHORE_HPP_INCLUDED_
  9. #define BOOST_WINAPI_SEMAPHORE_HPP_INCLUDED_
  10. #include <boost/winapi/basic_types.hpp>
  11. #ifdef BOOST_HAS_PRAGMA_ONCE
  12. #pragma once
  13. #endif
  14. #if !defined( BOOST_USE_WINDOWS_H )
  15. extern "C" {
  16. #if BOOST_WINAPI_PARTITION_APP_SYSTEM
  17. #if !defined( BOOST_NO_ANSI_APIS )
  18. BOOST_SYMBOL_IMPORT boost::winapi::HANDLE_ BOOST_WINAPI_WINAPI_CC
  19. CreateSemaphoreA(
  20. ::_SECURITY_ATTRIBUTES* lpSemaphoreAttributes,
  21. boost::winapi::LONG_ lInitialCount,
  22. boost::winapi::LONG_ lMaximumCount,
  23. boost::winapi::LPCSTR_ lpName);
  24. #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
  25. BOOST_SYMBOL_IMPORT boost::winapi::HANDLE_ BOOST_WINAPI_WINAPI_CC
  26. CreateSemaphoreExA(
  27. ::_SECURITY_ATTRIBUTES* lpSemaphoreAttributes,
  28. boost::winapi::LONG_ lInitialCount,
  29. boost::winapi::LONG_ lMaximumCount,
  30. boost::winapi::LPCSTR_ lpName,
  31. boost::winapi::DWORD_ dwFlags,
  32. boost::winapi::DWORD_ dwDesiredAccess);
  33. #endif
  34. #endif // !defined( BOOST_NO_ANSI_APIS )
  35. BOOST_SYMBOL_IMPORT boost::winapi::HANDLE_ BOOST_WINAPI_WINAPI_CC
  36. CreateSemaphoreW(
  37. ::_SECURITY_ATTRIBUTES* lpSemaphoreAttributes,
  38. boost::winapi::LONG_ lInitialCount,
  39. boost::winapi::LONG_ lMaximumCount,
  40. boost::winapi::LPCWSTR_ lpName);
  41. #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
  42. BOOST_SYMBOL_IMPORT boost::winapi::HANDLE_ BOOST_WINAPI_WINAPI_CC
  43. CreateSemaphoreExW(
  44. ::_SECURITY_ATTRIBUTES* lpSemaphoreAttributes,
  45. boost::winapi::LONG_ lInitialCount,
  46. boost::winapi::LONG_ lMaximumCount,
  47. boost::winapi::LPCWSTR_ lpName,
  48. boost::winapi::DWORD_ dwFlags,
  49. boost::winapi::DWORD_ dwDesiredAccess);
  50. #endif
  51. BOOST_SYMBOL_IMPORT boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
  52. ReleaseSemaphore(
  53. boost::winapi::HANDLE_ hSemaphore,
  54. boost::winapi::LONG_ lReleaseCount,
  55. boost::winapi::LPLONG_ lpPreviousCount);
  56. #endif // BOOST_WINAPI_PARTITION_APP_SYSTEM
  57. #if BOOST_WINAPI_PARTITION_DESKTOP_SYSTEM
  58. #if !defined( BOOST_NO_ANSI_APIS )
  59. BOOST_SYMBOL_IMPORT boost::winapi::HANDLE_ BOOST_WINAPI_WINAPI_CC
  60. OpenSemaphoreA(
  61. boost::winapi::DWORD_ dwDesiredAccess,
  62. boost::winapi::BOOL_ bInheritHandle,
  63. boost::winapi::LPCSTR_ lpName);
  64. #endif // !defined( BOOST_NO_ANSI_APIS )
  65. BOOST_SYMBOL_IMPORT boost::winapi::HANDLE_ BOOST_WINAPI_WINAPI_CC
  66. OpenSemaphoreW(
  67. boost::winapi::DWORD_ dwDesiredAccess,
  68. boost::winapi::BOOL_ bInheritHandle,
  69. boost::winapi::LPCWSTR_ lpName);
  70. #endif // BOOST_WINAPI_PARTITION_DESKTOP_SYSTEM
  71. } // extern "C"
  72. #endif // !defined( BOOST_USE_WINDOWS_H )
  73. namespace boost {
  74. namespace winapi {
  75. #if BOOST_WINAPI_PARTITION_APP_SYSTEM
  76. using ::ReleaseSemaphore;
  77. #if defined( BOOST_USE_WINDOWS_H )
  78. BOOST_CONSTEXPR_OR_CONST DWORD_ SEMAPHORE_ALL_ACCESS_ = SEMAPHORE_ALL_ACCESS;
  79. BOOST_CONSTEXPR_OR_CONST DWORD_ SEMAPHORE_MODIFY_STATE_ = SEMAPHORE_MODIFY_STATE;
  80. #else // defined( BOOST_USE_WINDOWS_H )
  81. BOOST_CONSTEXPR_OR_CONST DWORD_ SEMAPHORE_ALL_ACCESS_ = 0x001F0003;
  82. BOOST_CONSTEXPR_OR_CONST DWORD_ SEMAPHORE_MODIFY_STATE_ = 0x00000002;
  83. #endif // defined( BOOST_USE_WINDOWS_H )
  84. // Undocumented and not present in Windows SDK. Enables NtQuerySemaphore.
  85. // http://undocumented.ntinternals.net/index.html?page=UserMode%2FUndocumented%20Functions%2FNT%20Objects%2FEvent%2FNtQueryEvent.html
  86. BOOST_CONSTEXPR_OR_CONST DWORD_ SEMAPHORE_QUERY_STATE_ = 0x00000001;
  87. BOOST_CONSTEXPR_OR_CONST DWORD_ semaphore_all_access = SEMAPHORE_ALL_ACCESS_;
  88. BOOST_CONSTEXPR_OR_CONST DWORD_ semaphore_modify_state = SEMAPHORE_MODIFY_STATE_;
  89. #if !defined( BOOST_NO_ANSI_APIS )
  90. BOOST_FORCEINLINE HANDLE_ CreateSemaphoreA(SECURITY_ATTRIBUTES_* lpSemaphoreAttributes, LONG_ lInitialCount, LONG_ lMaximumCount, LPCSTR_ lpName)
  91. {
  92. return ::CreateSemaphoreA(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpSemaphoreAttributes), lInitialCount, lMaximumCount, lpName);
  93. }
  94. #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
  95. BOOST_FORCEINLINE HANDLE_ CreateSemaphoreExA(SECURITY_ATTRIBUTES_* lpSemaphoreAttributes, LONG_ lInitialCount, LONG_ lMaximumCount, LPCSTR_ lpName, DWORD_ dwFlags, DWORD_ dwDesiredAccess)
  96. {
  97. return ::CreateSemaphoreExA(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpSemaphoreAttributes), lInitialCount, lMaximumCount, lpName, dwFlags, dwDesiredAccess);
  98. }
  99. #endif
  100. #endif // !defined( BOOST_NO_ANSI_APIS )
  101. BOOST_FORCEINLINE HANDLE_ CreateSemaphoreW(SECURITY_ATTRIBUTES_* lpSemaphoreAttributes, LONG_ lInitialCount, LONG_ lMaximumCount, LPCWSTR_ lpName)
  102. {
  103. return ::CreateSemaphoreW(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpSemaphoreAttributes), lInitialCount, lMaximumCount, lpName);
  104. }
  105. #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
  106. BOOST_FORCEINLINE HANDLE_ CreateSemaphoreExW(SECURITY_ATTRIBUTES_* lpSemaphoreAttributes, LONG_ lInitialCount, LONG_ lMaximumCount, LPCWSTR_ lpName, DWORD_ dwFlags, DWORD_ dwDesiredAccess)
  107. {
  108. return ::CreateSemaphoreExW(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpSemaphoreAttributes), lInitialCount, lMaximumCount, lpName, dwFlags, dwDesiredAccess);
  109. }
  110. #endif
  111. #if !defined( BOOST_NO_ANSI_APIS )
  112. BOOST_FORCEINLINE HANDLE_ create_semaphore(SECURITY_ATTRIBUTES_* lpSemaphoreAttributes, LONG_ lInitialCount, LONG_ lMaximumCount, LPCSTR_ lpName)
  113. {
  114. return winapi::CreateSemaphoreA(lpSemaphoreAttributes, lInitialCount, lMaximumCount, lpName);
  115. }
  116. #endif
  117. BOOST_FORCEINLINE HANDLE_ create_semaphore(SECURITY_ATTRIBUTES_* lpSemaphoreAttributes, LONG_ lInitialCount, LONG_ lMaximumCount, LPCWSTR_ lpName)
  118. {
  119. return winapi::CreateSemaphoreW(lpSemaphoreAttributes, lInitialCount, lMaximumCount, lpName);
  120. }
  121. BOOST_FORCEINLINE HANDLE_ create_anonymous_semaphore(SECURITY_ATTRIBUTES_* lpSemaphoreAttributes, LONG_ lInitialCount, LONG_ lMaximumCount)
  122. {
  123. return winapi::CreateSemaphoreW(lpSemaphoreAttributes, lInitialCount, lMaximumCount, 0);
  124. }
  125. #endif // BOOST_WINAPI_PARTITION_APP_SYSTEM
  126. #if BOOST_WINAPI_PARTITION_DESKTOP_SYSTEM
  127. #if !defined( BOOST_NO_ANSI_APIS )
  128. using ::OpenSemaphoreA;
  129. BOOST_FORCEINLINE HANDLE_ open_semaphore(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCSTR_ lpName)
  130. {
  131. return ::OpenSemaphoreA(dwDesiredAccess, bInheritHandle, lpName);
  132. }
  133. #endif // !defined( BOOST_NO_ANSI_APIS )
  134. using ::OpenSemaphoreW;
  135. BOOST_FORCEINLINE HANDLE_ open_semaphore(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCWSTR_ lpName)
  136. {
  137. return ::OpenSemaphoreW(dwDesiredAccess, bInheritHandle, lpName);
  138. }
  139. #endif // BOOST_WINAPI_PARTITION_DESKTOP_SYSTEM
  140. }
  141. }
  142. #endif // BOOST_WINAPI_SEMAPHORE_HPP_INCLUDED_