30 #ifndef _GLIBCXX_MUTEX_H
31 #define _GLIBCXX_MUTEX_H 1
33 #pragma GCC system_header
35 #if __cplusplus < 201103L
41 #include <bits/gthr.h>
43 namespace std _GLIBCXX_VISIBILITY(default)
45 _GLIBCXX_BEGIN_NAMESPACE_VERSION
55 #ifdef _GLIBCXX_HAS_GTHREADS
62 typedef __gthread_mutex_t __native_type;
64 #ifdef __GTHREAD_MUTEX_INIT
65 __native_type _M_mutex = __GTHREAD_MUTEX_INIT;
67 constexpr __mutex_base() noexcept = default;
69 __native_type _M_mutex;
71 __mutex_base() noexcept
74 __GTHREAD_MUTEX_INIT_FUNCTION(&_M_mutex);
77 ~__mutex_base() noexcept { __gthread_mutex_destroy(&_M_mutex); }
80 __mutex_base(
const __mutex_base&) =
delete;
81 __mutex_base& operator=(
const __mutex_base&) =
delete;
96 class mutex :
private __mutex_base
99 typedef __native_type* native_handle_type;
101 #ifdef __GTHREAD_MUTEX_INIT
104 mutex() noexcept =
default;
113 int __e = __gthread_mutex_lock(&_M_mutex);
117 __throw_system_error(__e);
125 return !__gthread_mutex_trylock(&_M_mutex);
132 __gthread_mutex_unlock(&_M_mutex);
136 native_handle() noexcept
137 {
return &_M_mutex; }
145 using timespec = __gthread_time_t;
150 #ifndef __GTHREAD_COND_INIT
151 __GTHREAD_COND_INIT_FUNCTION(&_M_cond);
157 int __e __attribute__((__unused__)) = __gthread_cond_destroy(&_M_cond);
158 __glibcxx_assert(__e != EBUSY);
161 __condvar(
const __condvar&) =
delete;
162 __condvar& operator=(
const __condvar&) =
delete;
164 __gthread_cond_t* native_handle() noexcept {
return &_M_cond; }
170 int __e __attribute__((__unused__))
171 = __gthread_cond_wait(&_M_cond, __m.native_handle());
172 __glibcxx_assert(__e == 0);
176 wait_until(mutex& __m, timespec& __abs_time)
178 __gthread_cond_timedwait(&_M_cond, __m.native_handle(), &__abs_time);
181 #ifdef _GLIBCXX_USE_PTHREAD_COND_CLOCKWAIT
183 wait_until(mutex& __m, clockid_t __clock, timespec& __abs_time)
185 pthread_cond_clockwait(&_M_cond, __m.native_handle(), __clock,
191 notify_one() noexcept
193 int __e __attribute__((__unused__)) = __gthread_cond_signal(&_M_cond);
194 __glibcxx_assert(__e == 0);
198 notify_all() noexcept
200 int __e __attribute__((__unused__)) = __gthread_cond_broadcast(&_M_cond);
201 __glibcxx_assert(__e == 0);
205 #ifdef __GTHREAD_COND_INIT
206 __gthread_cond_t _M_cond = __GTHREAD_COND_INIT;
208 __gthread_cond_t _M_cond;
213 #endif // _GLIBCXX_HAS_GTHREADS
242 template<
typename _Mutex>
246 typedef _Mutex mutex_type;
248 explicit lock_guard(mutex_type& __m) : _M_device(__m)
249 { _M_device.lock(); }
255 { _M_device.unlock(); }
261 mutex_type& _M_device;
265 _GLIBCXX_END_NAMESPACE_VERSION
268 #endif // _GLIBCXX_MUTEX_H