1 /*
2 * Copyright 2010 Vicente J. Botet Escriba
3 * Copyright 2015, 2017 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_MUTEX_HPP_INCLUDED_
10 #define BOOST_WINAPI_MUTEX_HPP_INCLUDED_
11
12 #include <boost/winapi/basic_types.hpp>
13 #include <boost/winapi/detail/header.hpp>
14
15 #ifdef BOOST_HAS_PRAGMA_ONCE
16 #pragma once
17 #endif
18
19 #if !defined( BOOST_USE_WINDOWS_H ) && BOOST_WINAPI_PARTITION_APP_SYSTEM
20 extern "C" {
21 #if !defined( BOOST_NO_ANSI_APIS )
22 BOOST_WINAPI_IMPORT boost::winapi::HANDLE_ BOOST_WINAPI_WINAPI_CC
23 CreateMutexA(
24 ::_SECURITY_ATTRIBUTES* lpMutexAttributes,
25 boost::winapi::BOOL_ bInitialOwner,
26 boost::winapi::LPCSTR_ lpName);
27 #endif
28
29 BOOST_WINAPI_IMPORT_EXCEPT_WM boost::winapi::HANDLE_ BOOST_WINAPI_WINAPI_CC
30 CreateMutexW(
31 ::_SECURITY_ATTRIBUTES* lpMutexAttributes,
32 boost::winapi::BOOL_ bInitialOwner,
33 boost::winapi::LPCWSTR_ lpName);
34 } // extern "C"
35 #endif // !defined( BOOST_USE_WINDOWS_H ) && BOOST_WINAPI_PARTITION_APP_SYSTEM
36
37 #if !defined( BOOST_USE_WINDOWS_H )
38 extern "C" {
39 #if !defined( BOOST_NO_ANSI_APIS )
40 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
41 BOOST_WINAPI_IMPORT boost::winapi::HANDLE_ BOOST_WINAPI_WINAPI_CC
42 CreateMutexExA(
43 ::_SECURITY_ATTRIBUTES* lpMutexAttributes,
44 boost::winapi::LPCSTR_ lpName,
45 boost::winapi::DWORD_ dwFlags,
46 boost::winapi::DWORD_ dwDesiredAccess);
47 #endif
48
49 BOOST_WINAPI_IMPORT boost::winapi::HANDLE_ BOOST_WINAPI_WINAPI_CC
50 OpenMutexA(
51 boost::winapi::DWORD_ dwDesiredAccess,
52 boost::winapi::BOOL_ bInheritHandle,
53 boost::winapi::LPCSTR_ lpName);
54 #endif // !defined( BOOST_NO_ANSI_APIS )
55
56 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
57 BOOST_WINAPI_IMPORT boost::winapi::HANDLE_ BOOST_WINAPI_WINAPI_CC
58 CreateMutexExW(
59 ::_SECURITY_ATTRIBUTES* lpMutexAttributes,
60 boost::winapi::LPCWSTR_ lpName,
61 boost::winapi::DWORD_ dwFlags,
62 boost::winapi::DWORD_ dwDesiredAccess);
63 #endif
64
65 BOOST_WINAPI_IMPORT boost::winapi::HANDLE_ BOOST_WINAPI_WINAPI_CC
66 OpenMutexW(
67 boost::winapi::DWORD_ dwDesiredAccess,
68 boost::winapi::BOOL_ bInheritHandle,
69 boost::winapi::LPCWSTR_ lpName);
70
71 BOOST_WINAPI_IMPORT_EXCEPT_WM boost::winapi::BOOL_ BOOST_WINAPI_WINAPI_CC
72 ReleaseMutex(boost::winapi::HANDLE_ hMutex);
73 } // extern "C"
74 #endif
75
76 namespace boost {
77 namespace winapi {
78
79 #if !defined( BOOST_NO_ANSI_APIS )
80 using ::OpenMutexA;
81 #endif
82 using ::OpenMutexW;
83 using ::ReleaseMutex;
84
85 #if defined( BOOST_USE_WINDOWS_H )
86
87 BOOST_CONSTEXPR_OR_CONST DWORD_ MUTEX_ALL_ACCESS_ = MUTEX_ALL_ACCESS;
88 BOOST_CONSTEXPR_OR_CONST DWORD_ MUTEX_MODIFY_STATE_ = MUTEX_MODIFY_STATE;
89 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
90 BOOST_CONSTEXPR_OR_CONST DWORD_ CREATE_MUTEX_INITIAL_OWNER_ = CREATE_MUTEX_INITIAL_OWNER;
91 #endif
92
93 #else // defined( BOOST_USE_WINDOWS_H )
94
95 BOOST_CONSTEXPR_OR_CONST DWORD_ MUTEX_ALL_ACCESS_ = 0x001F0001;
96 BOOST_CONSTEXPR_OR_CONST DWORD_ MUTEX_MODIFY_STATE_ = 0x00000001;
97 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
98 BOOST_CONSTEXPR_OR_CONST DWORD_ CREATE_MUTEX_INITIAL_OWNER_ = 0x00000001;
99 #endif
100
101 #endif // defined( BOOST_USE_WINDOWS_H )
102
103 BOOST_CONSTEXPR_OR_CONST DWORD_ mutex_all_access = MUTEX_ALL_ACCESS_;
104 BOOST_CONSTEXPR_OR_CONST DWORD_ mutex_modify_state = MUTEX_MODIFY_STATE_;
105 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
106 BOOST_CONSTEXPR_OR_CONST DWORD_ create_mutex_initial_owner = CREATE_MUTEX_INITIAL_OWNER_;
107 #endif
108
109 #if !defined( BOOST_NO_ANSI_APIS )
CreateMutexA(SECURITY_ATTRIBUTES_ * lpMutexAttributes,BOOL_ bInitialOwner,LPCSTR_ lpName)110 BOOST_FORCEINLINE HANDLE_ CreateMutexA(SECURITY_ATTRIBUTES_* lpMutexAttributes, BOOL_ bInitialOwner, LPCSTR_ lpName)
111 {
112 #if !BOOST_WINAPI_PARTITION_APP_SYSTEM && BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
113 const DWORD_ flags = bInitialOwner ? create_mutex_initial_owner : 0u;
114 return ::CreateMutexExA(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpMutexAttributes), lpName, flags, mutex_all_access);
115 #else
116 return ::CreateMutexA(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpMutexAttributes), bInitialOwner, lpName);
117 #endif
118 }
119
120 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
CreateMutexExA(SECURITY_ATTRIBUTES_ * lpMutexAttributes,LPCSTR_ lpName,DWORD_ dwFlags,DWORD_ dwDesiredAccess)121 BOOST_FORCEINLINE HANDLE_ CreateMutexExA(
122 SECURITY_ATTRIBUTES_* lpMutexAttributes,
123 LPCSTR_ lpName,
124 DWORD_ dwFlags,
125 DWORD_ dwDesiredAccess)
126 {
127 return ::CreateMutexExA(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpMutexAttributes), lpName, dwFlags, dwDesiredAccess);
128 }
129 #endif
130 #endif
131
CreateMutexW(SECURITY_ATTRIBUTES_ * lpMutexAttributes,BOOL_ bInitialOwner,LPCWSTR_ lpName)132 BOOST_FORCEINLINE HANDLE_ CreateMutexW(SECURITY_ATTRIBUTES_* lpMutexAttributes, BOOL_ bInitialOwner, LPCWSTR_ lpName)
133 {
134 #if !BOOST_WINAPI_PARTITION_APP_SYSTEM && BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
135 const DWORD_ flags = bInitialOwner ? create_mutex_initial_owner : 0u;
136 return ::CreateMutexExW(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpMutexAttributes), lpName, flags, mutex_all_access);
137 #else
138 return ::CreateMutexW(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpMutexAttributes), bInitialOwner, lpName);
139 #endif
140 }
141
142 #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
CreateMutexExW(SECURITY_ATTRIBUTES_ * lpMutexAttributes,LPCWSTR_ lpName,DWORD_ dwFlags,DWORD_ dwDesiredAccess)143 BOOST_FORCEINLINE HANDLE_ CreateMutexExW(
144 SECURITY_ATTRIBUTES_* lpMutexAttributes,
145 LPCWSTR_ lpName,
146 DWORD_ dwFlags,
147 DWORD_ dwDesiredAccess)
148 {
149 return ::CreateMutexExW(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpMutexAttributes), lpName, dwFlags, dwDesiredAccess);
150 }
151 #endif
152
153 #if !defined( BOOST_NO_ANSI_APIS )
create_mutex(SECURITY_ATTRIBUTES_ * lpAttributes,BOOL_ bInitialOwner,LPCSTR_ lpName)154 BOOST_FORCEINLINE HANDLE_ create_mutex(SECURITY_ATTRIBUTES_* lpAttributes, BOOL_ bInitialOwner, LPCSTR_ lpName)
155 {
156 return winapi::CreateMutexA(lpAttributes, bInitialOwner, lpName);
157 }
158
open_mutex(DWORD_ dwDesiredAccess,BOOL_ bInheritHandle,LPCSTR_ lpName)159 BOOST_FORCEINLINE HANDLE_ open_mutex(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCSTR_ lpName)
160 {
161 return ::OpenMutexA(dwDesiredAccess, bInheritHandle, lpName);
162 }
163 #endif
164
create_mutex(SECURITY_ATTRIBUTES_ * lpAttributes,BOOL_ bInitialOwner,LPCWSTR_ lpName)165 BOOST_FORCEINLINE HANDLE_ create_mutex(SECURITY_ATTRIBUTES_* lpAttributes, BOOL_ bInitialOwner, LPCWSTR_ lpName)
166 {
167 return winapi::CreateMutexW(lpAttributes, bInitialOwner, lpName);
168 }
169
open_mutex(DWORD_ dwDesiredAccess,BOOL_ bInheritHandle,LPCWSTR_ lpName)170 BOOST_FORCEINLINE HANDLE_ open_mutex(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCWSTR_ lpName)
171 {
172 return ::OpenMutexW(dwDesiredAccess, bInheritHandle, lpName);
173 }
174
create_anonymous_mutex(SECURITY_ATTRIBUTES_ * lpAttributes,BOOL_ bInitialOwner)175 BOOST_FORCEINLINE HANDLE_ create_anonymous_mutex(SECURITY_ATTRIBUTES_* lpAttributes, BOOL_ bInitialOwner)
176 {
177 return winapi::CreateMutexW(lpAttributes, bInitialOwner, 0);
178 }
179
180 }
181 }
182
183 #include <boost/winapi/detail/footer.hpp>
184
185 #endif // BOOST_WINAPI_MUTEX_HPP_INCLUDED_
186