comparison DEPENDENCIES/generic/include/boost/regex/pending/static_mutex.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children c530137014c0
comparison
equal deleted inserted replaced
15:663ca0da4350 16:2665513ce2d3
1 /*
2 *
3 * Copyright (c) 2004
4 * John Maddock
5 *
6 * Use, modification and distribution are subject to the
7 * Boost Software License, Version 1.0. (See accompanying file
8 * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9 *
10 */
11
12 /*
13 * LOCATION: see http://www.boost.org for most recent version.
14 * FILE static_mutex.hpp
15 * VERSION see <boost/version.hpp>
16 * DESCRIPTION: Declares static_mutex lock type, there are three different
17 * implementations: POSIX pthreads, WIN32 threads, and portable,
18 * these are described in more detail below.
19 */
20
21 #ifndef BOOST_REGEX_STATIC_MUTEX_HPP
22 #define BOOST_REGEX_STATIC_MUTEX_HPP
23
24 #include <boost/config.hpp>
25 #include <boost/regex/config.hpp> // dll import/export options.
26
27 #ifdef BOOST_HAS_PTHREADS
28 #include <pthread.h>
29 #endif
30
31 #if defined(BOOST_HAS_PTHREADS) && defined(PTHREAD_MUTEX_INITIALIZER)
32 //
33 // pthreads version:
34 // simple wrap around a pthread_mutex_t initialized with
35 // PTHREAD_MUTEX_INITIALIZER.
36 //
37 namespace boost{
38
39 class static_mutex;
40
41 #define BOOST_STATIC_MUTEX_INIT { PTHREAD_MUTEX_INITIALIZER, }
42
43 class BOOST_REGEX_DECL scoped_static_mutex_lock
44 {
45 public:
46 scoped_static_mutex_lock(static_mutex& mut, bool lk = true);
47 ~scoped_static_mutex_lock();
48 inline bool locked()const
49 {
50 return m_have_lock;
51 }
52 inline operator void const*()const
53 {
54 return locked() ? this : 0;
55 }
56 void lock();
57 void unlock();
58 private:
59 static_mutex& m_mutex;
60 bool m_have_lock;
61 };
62
63 class static_mutex
64 {
65 public:
66 typedef scoped_static_mutex_lock scoped_lock;
67 pthread_mutex_t m_mutex;
68 };
69
70 } // namespace boost
71 #elif defined(BOOST_HAS_WINTHREADS)
72 //
73 // Win32 version:
74 // Use a 32-bit int as a lock, along with a test-and-set
75 // implementation using InterlockedCompareExchange.
76 //
77
78 #include <boost/cstdint.hpp>
79
80 namespace boost{
81
82 class BOOST_REGEX_DECL scoped_static_mutex_lock;
83
84 class static_mutex
85 {
86 public:
87 typedef scoped_static_mutex_lock scoped_lock;
88 boost::int32_t m_mutex;
89 };
90
91 #define BOOST_STATIC_MUTEX_INIT { 0, }
92
93 class BOOST_REGEX_DECL scoped_static_mutex_lock
94 {
95 public:
96 scoped_static_mutex_lock(static_mutex& mut, bool lk = true);
97 ~scoped_static_mutex_lock();
98 operator void const*()const
99 {
100 return locked() ? this : 0;
101 }
102 bool locked()const
103 {
104 return m_have_lock;
105 }
106 void lock();
107 void unlock();
108 private:
109 static_mutex& m_mutex;
110 bool m_have_lock;
111 scoped_static_mutex_lock(const scoped_static_mutex_lock&);
112 scoped_static_mutex_lock& operator=(const scoped_static_mutex_lock&);
113 };
114
115 } // namespace
116
117 #else
118 //
119 // Portable version of a static mutex based on Boost.Thread library:
120 // This has to use a single mutex shared by all instances of static_mutex
121 // because boost::call_once doesn't alow us to pass instance information
122 // down to the initialisation proceedure. In fact the initialisation routine
123 // may need to be called more than once - but only once per instance.
124 //
125 // Since this preprocessor path is almost never taken, we hide these header
126 // dependencies so that build tools don't find them.
127 //
128 #define B1 <boost/thread/once.hpp>
129 #define B2 <boost/thread/recursive_mutex.hpp>
130 #include B1
131 #include B2
132 #undef B1
133 #undef B2
134
135 namespace boost{
136
137 class BOOST_REGEX_DECL scoped_static_mutex_lock;
138 extern "C" BOOST_REGEX_DECL void boost_regex_free_static_mutex();
139
140 class BOOST_REGEX_DECL static_mutex
141 {
142 public:
143 typedef scoped_static_mutex_lock scoped_lock;
144 static void init();
145 static boost::recursive_mutex* m_pmutex;
146 static boost::once_flag m_once;
147 };
148
149 #define BOOST_STATIC_MUTEX_INIT { }
150
151 class BOOST_REGEX_DECL scoped_static_mutex_lock
152 {
153 public:
154 scoped_static_mutex_lock(static_mutex& mut, bool lk = true);
155 ~scoped_static_mutex_lock();
156 operator void const*()const;
157 bool locked()const;
158 void lock();
159 void unlock();
160 private:
161 boost::recursive_mutex::scoped_lock* m_plock;
162 bool m_have_lock;
163 };
164
165 inline scoped_static_mutex_lock::operator void const*()const
166 {
167 return locked() ? this : 0;
168 }
169
170 inline bool scoped_static_mutex_lock::locked()const
171 {
172 return m_have_lock;
173 }
174
175 } // namespace
176
177 #endif
178
179 #endif