30#ifndef _GLIBCXX_MUTEX_H
31#define _GLIBCXX_MUTEX_H 1
33#pragma GCC system_header
35#if __cplusplus < 201103L
43namespace 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;
242 template<
typename _Mutex>
246 typedef _Mutex mutex_type;
249 explicit lock_guard(mutex_type& __m) : _M_device(__m)
250 { _M_device.lock(); }
257 { _M_device.unlock(); }
263 mutex_type& _M_device;
267_GLIBCXX_END_NAMESPACE_VERSION
constexpr try_to_lock_t try_to_lock
Tag used to prevent a scoped lock from blocking if a mutex is locked.
constexpr adopt_lock_t adopt_lock
Tag used to make a scoped lock take ownership of a locked mutex.
constexpr defer_lock_t defer_lock
Tag used to prevent a scoped lock from acquiring ownership of a mutex.
ISO C++ entities toplevel namespace is std.
Do not acquire ownership of the mutex.
Try to acquire ownership of the mutex without blocking.
Assume the calling thread has already obtained mutex ownership and manage it.
A simple scoped lock type.