diff options
Diffstat (limited to 'libstdc++-v3/src/mutex.cc')
-rw-r--r-- | libstdc++-v3/src/mutex.cc | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/libstdc++-v3/src/mutex.cc b/libstdc++-v3/src/mutex.cc index a9467c2..e0a9489 100644 --- a/libstdc++-v3/src/mutex.cc +++ b/libstdc++-v3/src/mutex.cc @@ -25,6 +25,18 @@ #include <mutex> #if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1) +#ifndef _GLIBCXX_HAVE_TLS +namespace +{ + std::mutex& + get_once_mutex() + { + static std::mutex once_mutex; + return once_mutex; + } +} +#endif + namespace std { const defer_lock_t defer_lock = defer_lock_t(); @@ -43,13 +55,11 @@ namespace std template class function<void()>; function<void()> __once_functor; - unique_lock<mutex>* __once_functor_lock; - - mutex& - __get_once_mutex() + unique_lock<mutex>& + __get_once_functor_lock() { - static mutex once_mutex; - return once_mutex; + static unique_lock<mutex> once_functor_lock(get_once_mutex(), defer_lock); + return once_functor_lock; } #endif @@ -59,7 +69,7 @@ namespace std { #ifndef _GLIBCXX_HAVE_TLS function<void()> __once_call = std::move(__once_functor); - __once_functor_lock->unlock(); + __get_once_functor_lock().unlock(); #endif __once_call(); } |