1// Copyright (C) 2000 Stephen Cleary
2// Copyright (C) 2018 Peter Dimov
3//
4// Distributed under the Boost Software License, Version 1.0. (See
5// accompanying file LICENSE_1_0.txt or copy at
6// http://www.boost.org/LICENSE_1_0.txt)
7//
8// See http://www.boost.org for updates, documentation, and revision history.
9
10#ifndef BOOST_POOL_MUTEX_HPP
11#define BOOST_POOL_MUTEX_HPP
12
13#include <boost/config.hpp>
14
15namespace boost{ namespace details{ namespace pool{
16
17class null_mutex
18{
19private:
20
21 null_mutex(const null_mutex &);
22 void operator=(const null_mutex &);
23
24public:
25
26 null_mutex() {}
27
28 static void lock() {}
29 static void unlock() {}
30};
31
32}}} // namespace boost::details::pool
33
34#if !defined(BOOST_HAS_THREADS) || defined(BOOST_NO_MT) || defined(BOOST_POOL_NO_MT)
35
36namespace boost{ namespace details{ namespace pool{
37
38typedef null_mutex default_mutex;
39
40}}} // namespace boost::details::pool
41
42#elif !defined(BOOST_NO_CXX11_HDR_MUTEX)
43
44#include <mutex>
45
46namespace boost{ namespace details{ namespace pool{
47
48typedef std::mutex default_mutex;
49
50}}} // namespace boost::details::pool
51
52#elif defined(BOOST_HAS_PTHREADS)
53
54#include <boost/assert.hpp>
55#include <pthread.h>
56
57namespace boost{ namespace details{ namespace pool{
58
59class pt_mutex
60{
61private:
62
63 pthread_mutex_t m_;
64
65 pt_mutex(pt_mutex const &);
66 pt_mutex & operator=(pt_mutex const &);
67
68public:
69
70 pt_mutex()
71 {
72 BOOST_VERIFY( pthread_mutex_init( &m_, 0 ) == 0 );
73 }
74
75 ~pt_mutex()
76 {
77 BOOST_VERIFY( pthread_mutex_destroy( &m_ ) == 0 );
78 }
79
80 void lock()
81 {
82 BOOST_VERIFY( pthread_mutex_lock( &m_ ) == 0 );
83 }
84
85 void unlock()
86 {
87 BOOST_VERIFY( pthread_mutex_unlock( &m_ ) == 0 );
88 }
89};
90
91typedef pt_mutex default_mutex;
92
93}}} // namespace boost::details::pool
94
95#elif defined(BOOST_HAS_WINTHREADS) || defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
96
97#include <boost/winapi/critical_section.hpp>
98
99namespace boost{ namespace details{ namespace pool{
100
101class cs_mutex
102{
103private:
104
105 boost::winapi::CRITICAL_SECTION_ cs_;
106
107 cs_mutex(cs_mutex const &);
108 cs_mutex & operator=(cs_mutex const &);
109
110public:
111
112 cs_mutex()
113 {
114 boost::winapi::InitializeCriticalSection( &cs_ );
115 }
116
117 ~cs_mutex()
118 {
119 boost::winapi::DeleteCriticalSection( &cs_ );
120 }
121
122 void lock()
123 {
124 boost::winapi::EnterCriticalSection( &cs_ );
125 }
126
127 void unlock()
128 {
129 boost::winapi::LeaveCriticalSection( &cs_ );
130 }
131};
132
133typedef cs_mutex default_mutex;
134
135}}} // namespace boost::details::pool
136
137#else
138
139// Use #define BOOST_DISABLE_THREADS to avoid this error
140# error Unrecognized threading platform
141
142#endif
143
144#endif // #ifndef BOOST_POOL_MUTEX_HPP
145

source code of boost/libs/pool/include/boost/pool/detail/mutex.hpp