aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/src/mutex.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libstdc++-v3/src/mutex.cc')
-rw-r--r--libstdc++-v3/src/mutex.cc24
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();
}