• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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