30#define _CONCURRENCE_H 1
33#pragma GCC system_header
42#pragma GCC diagnostic push
43#pragma GCC diagnostic ignored "-Wc++11-extensions"
45namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
47_GLIBCXX_BEGIN_NAMESPACE_VERSION
54 enum _Lock_policy { _S_single, _S_mutex, _S_atomic };
58 _GLIBCXX17_INLINE
const _Lock_policy __default_lock_policy =
61#elif defined _GLIBCXX_HAVE_ATOMIC_LOCK_POLICY
69 class __concurrence_lock_error :
public std::exception
74 {
return "__gnu_cxx::__concurrence_lock_error"; }
77 class __concurrence_unlock_error :
public std::exception
82 {
return "__gnu_cxx::__concurrence_unlock_error"; }
85 class __concurrence_broadcast_error :
public std::exception
90 {
return "__gnu_cxx::__concurrence_broadcast_error"; }
93 class __concurrence_wait_error :
public std::exception
98 {
return "__gnu_cxx::__concurrence_wait_error"; }
103 __throw_concurrence_lock_error()
104 { _GLIBCXX_THROW_OR_ABORT(__concurrence_lock_error()); }
107 __throw_concurrence_unlock_error()
108 { _GLIBCXX_THROW_OR_ABORT(__concurrence_unlock_error()); }
110#ifdef __GTHREAD_HAS_COND
112 __throw_concurrence_broadcast_error()
113 { _GLIBCXX_THROW_OR_ABORT(__concurrence_broadcast_error()); }
116 __throw_concurrence_wait_error()
117 { _GLIBCXX_THROW_OR_ABORT(__concurrence_wait_error()); }
123#if __GTHREADS && defined __GTHREAD_MUTEX_INIT
124 __gthread_mutex_t _M_mutex = __GTHREAD_MUTEX_INIT;
126 __gthread_mutex_t _M_mutex;
129 __mutex(
const __mutex&);
130 __mutex& operator=(
const __mutex&);
135#if __GTHREADS && ! defined __GTHREAD_MUTEX_INIT
136 if (__gthread_active_p())
137 __GTHREAD_MUTEX_INIT_FUNCTION(&_M_mutex);
141#if __GTHREADS && ! defined __GTHREAD_MUTEX_INIT
144 if (__gthread_active_p())
145 __gthread_mutex_destroy(&_M_mutex);
152 if (__gthread_active_p())
154 if (__gthread_mutex_lock(&_M_mutex) != 0)
155 __throw_concurrence_lock_error();
163 if (__gthread_active_p())
165 if (__gthread_mutex_unlock(&_M_mutex) != 0)
166 __throw_concurrence_unlock_error();
171 __gthread_mutex_t* gthread_mutex(
void)
172 {
return &_M_mutex; }
175 class __recursive_mutex
178#if __GTHREADS && defined __GTHREAD_RECURSIVE_MUTEX_INIT
179 __gthread_recursive_mutex_t _M_mutex = __GTHREAD_RECURSIVE_MUTEX_INIT;
181 __gthread_recursive_mutex_t _M_mutex;
184 __recursive_mutex(
const __recursive_mutex&);
185 __recursive_mutex& operator=(
const __recursive_mutex&);
190#if __GTHREADS && ! defined __GTHREAD_RECURSIVE_MUTEX_INIT
191 if (__gthread_active_p())
192 __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION(&_M_mutex);
196#if __GTHREADS && ! defined __GTHREAD_RECURSIVE_MUTEX_INIT
199 if (__gthread_active_p())
200 __gthread_recursive_mutex_destroy(&_M_mutex);
207 if (__gthread_active_p())
209 if (__gthread_recursive_mutex_lock(&_M_mutex) != 0)
210 __throw_concurrence_lock_error();
218 if (__gthread_active_p())
220 if (__gthread_recursive_mutex_unlock(&_M_mutex) != 0)
221 __throw_concurrence_unlock_error();
226 __gthread_recursive_mutex_t* gthread_recursive_mutex(
void)
227 {
return &_M_mutex; }
236 typedef __mutex __mutex_type;
239 __mutex_type& _M_device;
241 __scoped_lock(
const __scoped_lock&);
242 __scoped_lock& operator=(
const __scoped_lock&);
245 explicit __scoped_lock(__mutex_type& __name) : _M_device(__name)
246 { _M_device.lock(); }
248 ~__scoped_lock()
throw()
249 { _M_device.unlock(); }
252#ifdef __GTHREAD_HAS_COND
256#if __GTHREADS && defined __GTHREAD_COND_INIT
257 __gthread_cond_t _M_cond = __GTHREAD_COND_INIT;
259 __gthread_cond_t _M_cond;
262 __cond(
const __cond&);
263 __cond& operator=(
const __cond&);
268#if __GTHREADS && ! defined __GTHREAD_COND_INIT
269 if (__gthread_active_p())
270 __GTHREAD_COND_INIT_FUNCTION(&_M_cond);
274#if __GTHREADS && ! defined __GTHREAD_COND_INIT
277 if (__gthread_active_p())
278 __gthread_cond_destroy(&_M_cond);
285 if (__gthread_active_p())
287 if (__gthread_cond_broadcast(&_M_cond) != 0)
288 __throw_concurrence_broadcast_error();
293 void wait(__mutex *mutex)
297 if (__gthread_cond_wait(&_M_cond, mutex->gthread_mutex()) != 0)
298 __throw_concurrence_wait_error();
303 void wait_recursive(__recursive_mutex *mutex)
307 if (__gthread_cond_wait_recursive(&_M_cond,
308 mutex->gthread_recursive_mutex())
310 __throw_concurrence_wait_error();
317_GLIBCXX_END_NAMESPACE_VERSION
320#pragma GCC diagnostic pop
GNU extensions for public use.