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 
15 namespace boost{ namespace details{ namespace pool{
16 
17 class null_mutex
18 {
19 private:
20 
21     null_mutex(const null_mutex &);
22     void operator=(const null_mutex &);
23 
24 public:
25 
null_mutex()26     null_mutex() {}
27 
lock()28     static void lock() {}
unlock()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 
36 namespace boost{ namespace details{ namespace pool{
37 
38 typedef null_mutex default_mutex;
39 
40 }}} // namespace boost::details::pool
41 
42 #elif !defined(BOOST_NO_CXX11_HDR_MUTEX)
43 
44 #include <mutex>
45 
46 namespace boost{ namespace details{ namespace pool{
47 
48 typedef 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 
57 namespace boost{ namespace details{ namespace pool{
58 
59 class pt_mutex
60 {
61 private:
62 
63     pthread_mutex_t m_;
64 
65     pt_mutex(pt_mutex const &);
66     pt_mutex & operator=(pt_mutex const &);
67 
68 public:
69 
pt_mutex()70     pt_mutex()
71     {
72         BOOST_VERIFY( pthread_mutex_init( &m_, 0 ) == 0 );
73     }
74 
~pt_mutex()75     ~pt_mutex()
76     {
77         BOOST_VERIFY( pthread_mutex_destroy( &m_ ) == 0 );
78     }
79 
lock()80     void lock()
81     {
82         BOOST_VERIFY( pthread_mutex_lock( &m_ ) == 0 );
83     }
84 
unlock()85     void unlock()
86     {
87         BOOST_VERIFY( pthread_mutex_unlock( &m_ ) == 0 );
88     }
89 };
90 
91 typedef 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 
99 namespace boost{ namespace details{ namespace pool{
100 
101 class cs_mutex
102 {
103 private:
104 
105     boost::winapi::CRITICAL_SECTION_ cs_;
106 
107     cs_mutex(cs_mutex const &);
108     cs_mutex & operator=(cs_mutex const &);
109 
110 public:
111 
cs_mutex()112     cs_mutex()
113     {
114         boost::winapi::InitializeCriticalSection( &cs_ );
115     }
116 
~cs_mutex()117     ~cs_mutex()
118     {
119         boost::winapi::DeleteCriticalSection( &cs_ );
120     }
121 
lock()122     void lock()
123     {
124         boost::winapi::EnterCriticalSection( &cs_ );
125     }
126 
unlock()127     void unlock()
128     {
129         boost::winapi::LeaveCriticalSection( &cs_ );
130     }
131 };
132 
133 typedef 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