diff options
| author | redi <redi@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-10-24 23:26:25 +0000 |
|---|---|---|
| committer | redi <redi@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-10-24 23:26:25 +0000 |
| commit | e472b6e55a6a9ee668ddde8df21c2bb723db47e2 (patch) | |
| tree | e3d52074dedc82f0f2c8c9061b21d1667c769f01 /libstdc++-v3/include/std/mutex | |
| parent | 0db4cb4173f8989e98990586932234c71b71288f (diff) | |
| download | ppe42-gcc-e472b6e55a6a9ee668ddde8df21c2bb723db47e2.tar.gz ppe42-gcc-e472b6e55a6a9ee668ddde8df21c2bb723db47e2.zip | |
PR libstdc++/49894
* include/std/mutex (__mutex_base,__recursive_mutex_base): Define new
base classes to manage construction/destruction of native mutexes,
using NSDMI when INIT macros are defined.
(mutex,recursive_mutex,timed_mutex,recursive_timed_mutex): Derive from
new base classes.
* include/std/condition_variable (condition_variable): Use NSDMI when
INIT macro is defined. Use noexcept.
* src/condition_variable.cc (condition_variable): Explicitly-default
constructor/destructor when using NSDMI. Use noexcept.
(condition_variable_any): Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@180411 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/include/std/mutex')
| -rw-r--r-- | libstdc++-v3/include/std/mutex | 201 |
1 files changed, 101 insertions, 100 deletions
diff --git a/libstdc++-v3/include/std/mutex b/libstdc++-v3/include/std/mutex index a1a63b27f33..4d154ff6f0c 100644 --- a/libstdc++-v3/include/std/mutex +++ b/libstdc++-v3/include/std/mutex @@ -52,6 +52,94 @@ namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION + // Common base class for std::mutex and std::timed_mutex + class __mutex_base + { + protected: + typedef __gthread_mutex_t __native_type; + +#ifdef __GTHREAD_MUTEX_INIT + __native_type _M_mutex = __GTHREAD_MUTEX_INIT; + + constexpr __mutex_base() noexcept = default; +#else + __native_type _M_mutex; + + __mutex_base() noexcept + { + // XXX EAGAIN, ENOMEM, EPERM, EBUSY(may), EINVAL(may) + __GTHREAD_MUTEX_INIT_FUNCTION(&_M_mutex); + } + + ~__mutex_base() { __gthread_mutex_destroy(&_M_mutex); } +#endif + + __mutex_base(const __mutex_base&) = delete; + __mutex_base& operator=(const __mutex_base&) = delete; + }; + + // Common base class for std::recursive_mutex and std::timed_recursive_mutex + class __recursive_mutex_base + { + protected: + typedef __gthread_recursive_mutex_t __native_type; + + __recursive_mutex_base(const __recursive_mutex_base&) = delete; + __recursive_mutex_base& operator=(const __recursive_mutex_base&) = delete; + +#ifdef __GTHREAD_RECURSIVE_MUTEX_INIT + __native_type _M_mutex = __GTHREAD_RECURSIVE_MUTEX_INIT; + + __recursive_mutex_base() = default; +#else + __native_type _M_mutex; + + __recursive_mutex_base() + { + // XXX EAGAIN, ENOMEM, EPERM, EBUSY(may), EINVAL(may) + __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION(&_M_mutex); + } + + ~__recursive_mutex_base() + { _S_destroy(&_M_mutex); } + + private: + // FIXME: gthreads doesn't define __gthread_recursive_mutex_destroy + // so we need to obtain a __gthread_mutex_t to destroy + + // matches when there's only one mutex type + template<typename _Rm> + static + typename enable_if<is_same<_Rm, __gthread_mutex_t>::value, void>::type + _S_destroy(_Rm* __mx) + { __gthread_mutex_destroy(__mx); } + + // matches a recursive mutex with a member 'actual' + template<typename _Rm> + static typename enable_if<sizeof(&_Rm::actual), void>::type + _S_destroy(_Rm* __mx) + { __gthread_mutex_destroy(&__mx->actual); } + + // matches a gthr-win32.h recursive mutex + template<typename _Rm> + static typename enable_if<sizeof(&_Rm::sema), void>::type + _S_destroy(_Rm* __mx) + { + __gthread_mutex_t __tmp; + _S_destroy_win32(&__tmp, __mx); + } + + template<typename _Mx, typename _Rm> + static void + _S_destroy_win32(_Mx* __mx, _Rm const* __rmx) + { + __mx->counter = __rmx->counter; + __mx->sema = __rmx->sema; + __gthread_mutex_destroy(__mx); + } +#endif + }; + /** * @defgroup mutexes Mutexes * @ingroup concurrency @@ -61,25 +149,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION */ /// mutex - class mutex + class mutex : private __mutex_base { - typedef __gthread_mutex_t __native_type; - __native_type _M_mutex; - public: typedef __native_type* native_handle_type; #ifdef __GTHREAD_MUTEX_INIT - constexpr mutex() noexcept : _M_mutex(__GTHREAD_MUTEX_INIT) { } -#else - mutex() noexcept - { - // XXX EAGAIN, ENOMEM, EPERM, EBUSY(may), EINVAL(may) - __GTHREAD_MUTEX_INIT_FUNCTION(&_M_mutex); - } - - ~mutex() { __gthread_mutex_destroy(&_M_mutex); } + constexpr #endif + mutex() noexcept = default; + ~mutex() = default; mutex(const mutex&) = delete; mutex& operator=(const mutex&) = delete; @@ -113,66 +192,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return &_M_mutex; } }; -#ifndef __GTHREAD_RECURSIVE_MUTEX_INIT - // FIXME: gthreads doesn't define __gthread_recursive_mutex_destroy - // so we need to obtain a __gthread_mutex_t to destroy - class __destroy_recursive_mutex - { - template<typename _Mx, typename _Rm> - static void - _S_destroy_win32(_Mx* __mx, _Rm const* __rmx) - { - __mx->counter = __rmx->counter; - __mx->sema = __rmx->sema; - __gthread_mutex_destroy(__mx); - } - - public: - // matches a gthr-win32.h recursive mutex - template<typename _Rm> - static typename enable_if<sizeof(&_Rm::sema), void>::type - _S_destroy(_Rm* __mx) - { - __gthread_mutex_t __tmp; - _S_destroy_win32(&__tmp, __mx); - } - - // matches a recursive mutex with a member 'actual' - template<typename _Rm> - static typename enable_if<sizeof(&_Rm::actual), void>::type - _S_destroy(_Rm* __mx) - { __gthread_mutex_destroy(&__mx->actual); } - - // matches when there's only one mutex type - template<typename _Rm> - static - typename enable_if<is_same<_Rm, __gthread_mutex_t>::value, void>::type - _S_destroy(_Rm* __mx) - { __gthread_mutex_destroy(__mx); } - }; -#endif - /// recursive_mutex - class recursive_mutex + class recursive_mutex : private __recursive_mutex_base { - typedef __gthread_recursive_mutex_t __native_type; - __native_type _M_mutex; - public: typedef __native_type* native_handle_type; -#ifdef __GTHREAD_RECURSIVE_MUTEX_INIT - recursive_mutex() : _M_mutex(__GTHREAD_RECURSIVE_MUTEX_INIT) { } -#else - recursive_mutex() - { - // XXX EAGAIN, ENOMEM, EPERM, EBUSY(may), EINVAL(may) - __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION(&_M_mutex); - } - - ~recursive_mutex() - { __destroy_recursive_mutex::_S_destroy(&_M_mutex); } -#endif + recursive_mutex() = default; + ~recursive_mutex() = default; recursive_mutex(const recursive_mutex&) = delete; recursive_mutex& operator=(const recursive_mutex&) = delete; @@ -208,31 +235,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #if _GTHREAD_USE_MUTEX_TIMEDLOCK /// timed_mutex - class timed_mutex + class timed_mutex : private __mutex_base { - typedef __gthread_mutex_t __native_type; - #ifdef _GLIBCXX_USE_CLOCK_MONOTONIC typedef chrono::steady_clock __clock_t; #else typedef chrono::high_resolution_clock __clock_t; #endif - __native_type _M_mutex; - public: typedef __native_type* native_handle_type; -#ifdef __GTHREAD_MUTEX_INIT - timed_mutex() : _M_mutex(__GTHREAD_MUTEX_INIT) { } -#else - timed_mutex() - { - __GTHREAD_MUTEX_INIT_FUNCTION(&_M_mutex); - } - - ~timed_mutex() { __gthread_mutex_destroy(&_M_mutex); } -#endif + timed_mutex() = default; + ~timed_mutex() = default; timed_mutex(const timed_mutex&) = delete; timed_mutex& operator=(const timed_mutex&) = delete; @@ -313,33 +328,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION }; /// recursive_timed_mutex - class recursive_timed_mutex + class recursive_timed_mutex : private __recursive_mutex_base { - typedef __gthread_recursive_mutex_t __native_type; - #ifdef _GLIBCXX_USE_CLOCK_MONOTONIC typedef chrono::steady_clock __clock_t; #else typedef chrono::high_resolution_clock __clock_t; #endif - __native_type _M_mutex; - public: typedef __native_type* native_handle_type; -#ifdef __GTHREAD_RECURSIVE_MUTEX_INIT - recursive_timed_mutex() : _M_mutex(__GTHREAD_RECURSIVE_MUTEX_INIT) { } -#else - recursive_timed_mutex() - { - // XXX EAGAIN, ENOMEM, EPERM, EBUSY(may), EINVAL(may) - __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION(&_M_mutex); - } - - ~recursive_timed_mutex() - { __destroy_recursive_mutex::_S_destroy(&_M_mutex); } -#endif + recursive_timed_mutex() = default; + ~recursive_timed_mutex() = default; recursive_timed_mutex(const recursive_timed_mutex&) = delete; recursive_timed_mutex& operator=(const recursive_timed_mutex&) = delete; |

