]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/log/include/boost/log/detail/light_rw_mutex.hpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / log / include / boost / log / detail / light_rw_mutex.hpp
1 /*
2 * Copyright Andrey Semashev 2007 - 2015.
3 * Distributed under the Boost Software License, Version 1.0.
4 * (See accompanying file LICENSE_1_0.txt or copy at
5 * http://www.boost.org/LICENSE_1_0.txt)
6 */
7 /*!
8 * \file light_rw_mutex.hpp
9 * \author Andrey Semashev
10 * \date 24.03.2009
11 *
12 * \brief This header is the Boost.Log library implementation, see the library documentation
13 * at http://www.boost.org/doc/libs/release/libs/log/doc/html/index.html.
14 */
15
16 #ifndef BOOST_LOG_DETAIL_LIGHT_RW_MUTEX_HPP_INCLUDED_
17 #define BOOST_LOG_DETAIL_LIGHT_RW_MUTEX_HPP_INCLUDED_
18
19 #include <boost/log/detail/config.hpp>
20
21 #ifdef BOOST_HAS_PRAGMA_ONCE
22 #pragma once
23 #endif
24
25 #ifndef BOOST_LOG_NO_THREADS
26
27 #include <boost/log/detail/header.hpp>
28
29 #if defined(BOOST_THREAD_POSIX) // This one can be defined by users, so it should go first
30 #define BOOST_LOG_LWRWMUTEX_USE_PTHREAD
31 #elif defined(BOOST_WINDOWS) && (BOOST_USE_WINAPI_VERSION+0) >= (BOOST_WINAPI_VERSION_WIN6+0)
32 #define BOOST_LOG_LWRWMUTEX_USE_SRWLOCK
33 #elif defined(BOOST_HAS_PTHREADS)
34 #define BOOST_LOG_LWRWMUTEX_USE_PTHREAD
35 #endif
36
37 #if defined(BOOST_LOG_LWRWMUTEX_USE_SRWLOCK)
38
39 #include <boost/detail/winapi/srw_lock.hpp>
40
41 namespace boost {
42
43 BOOST_LOG_OPEN_NAMESPACE
44
45 namespace aux {
46
47 //! A light read/write mutex that uses WinNT 6 and later APIs
48 class light_rw_mutex
49 {
50 boost::detail::winapi::SRWLOCK_ m_Mutex;
51
52 public:
53 light_rw_mutex()
54 {
55 boost::detail::winapi::InitializeSRWLock(&m_Mutex);
56 }
57 void lock_shared()
58 {
59 boost::detail::winapi::AcquireSRWLockShared(&m_Mutex);
60 }
61 void unlock_shared()
62 {
63 boost::detail::winapi::ReleaseSRWLockShared(&m_Mutex);
64 }
65 void lock()
66 {
67 boost::detail::winapi::AcquireSRWLockExclusive(&m_Mutex);
68 }
69 void unlock()
70 {
71 boost::detail::winapi::ReleaseSRWLockExclusive(&m_Mutex);
72 }
73
74 // Noncopyable
75 BOOST_DELETED_FUNCTION(light_rw_mutex(light_rw_mutex const&))
76 BOOST_DELETED_FUNCTION(light_rw_mutex& operator= (light_rw_mutex const&))
77 };
78
79 } // namespace aux
80
81 BOOST_LOG_CLOSE_NAMESPACE // namespace log
82
83 } // namespace boost
84
85 #elif defined(BOOST_LOG_LWRWMUTEX_USE_PTHREAD)
86
87 #include <pthread.h>
88
89 namespace boost {
90
91 BOOST_LOG_OPEN_NAMESPACE
92
93 namespace aux {
94
95 //! A light read/write mutex that maps directly onto POSIX threading library
96 class light_rw_mutex
97 {
98 pthread_rwlock_t m_Mutex;
99
100 public:
101 light_rw_mutex()
102 {
103 pthread_rwlock_init(&m_Mutex, NULL);
104 }
105 ~light_rw_mutex()
106 {
107 pthread_rwlock_destroy(&m_Mutex);
108 }
109 void lock_shared()
110 {
111 pthread_rwlock_rdlock(&m_Mutex);
112 }
113 void unlock_shared()
114 {
115 pthread_rwlock_unlock(&m_Mutex);
116 }
117 void lock()
118 {
119 pthread_rwlock_wrlock(&m_Mutex);
120 }
121 void unlock()
122 {
123 pthread_rwlock_unlock(&m_Mutex);
124 }
125
126 // Noncopyable
127 BOOST_DELETED_FUNCTION(light_rw_mutex(light_rw_mutex const&))
128 BOOST_DELETED_FUNCTION(light_rw_mutex& operator= (light_rw_mutex const&))
129 };
130
131 } // namespace aux
132
133 BOOST_LOG_CLOSE_NAMESPACE // namespace log
134
135 } // namespace boost
136
137 #else
138
139 namespace boost {
140
141 BOOST_LOG_OPEN_NAMESPACE
142
143 namespace aux {
144
145 //! A light read/write mutex
146 class light_rw_mutex
147 {
148 struct BOOST_LOG_MAY_ALIAS mutex_state { void* p; } m_Mutex;
149
150 public:
151 BOOST_LOG_API light_rw_mutex();
152 BOOST_LOG_API ~light_rw_mutex();
153 BOOST_LOG_API void lock_shared();
154 BOOST_LOG_API void unlock_shared();
155 BOOST_LOG_API void lock();
156 BOOST_LOG_API void unlock();
157
158 // Noncopyable
159 BOOST_DELETED_FUNCTION(light_rw_mutex(light_rw_mutex const&))
160 BOOST_DELETED_FUNCTION(light_rw_mutex& operator= (light_rw_mutex const&))
161 };
162
163 } // namespace aux
164
165 BOOST_LOG_CLOSE_NAMESPACE // namespace log
166
167 } // namespace boost
168
169 #endif
170
171 #include <boost/log/detail/footer.hpp>
172
173 #endif // BOOST_LOG_NO_THREADS
174
175 #endif // BOOST_LOG_DETAIL_LIGHT_RW_MUTEX_HPP_INCLUDED_