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