From cca36d72b941a1d02cfbcf0eebe5113c906222f5 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Sun, 26 Apr 2009 10:12:08 +0000 Subject: [PATCH] 2009-04-26 Paolo Carlini Revert the last commit. From-SVN: r146796 --- libstdc++-v3/ChangeLog | 4 ++ libstdc++-v3/config/abi/pre/gnu.ver | 3 +- libstdc++-v3/include/std/mutex | 14 +++-- libstdc++-v3/src/mutex.cc | 24 +++++--- .../30_threads/call_once/call_once2.cc | 56 ------------------- 5 files changed, 31 insertions(+), 70 deletions(-) delete mode 100644 libstdc++-v3/testsuite/30_threads/call_once/call_once2.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 60f7ef2ea2e..970e1672ae6 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,7 @@ +2009-04-26 Paolo Carlini + + Revert the last commit. + 2009-04-25 Jonathan Wakely * include/std/mutex (__get_once_functor_lock, __get_once_mutex): diff --git a/libstdc++-v3/config/abi/pre/gnu.ver b/libstdc++-v3/config/abi/pre/gnu.ver index bd2c63e2219..57183c1a670 100644 --- a/libstdc++-v3/config/abi/pre/gnu.ver +++ b/libstdc++-v3/config/abi/pre/gnu.ver @@ -879,8 +879,7 @@ GLIBCXX_3.4.11 { _ZSt11__once_call; _ZSt15__once_callable; _ZSt14__once_functor; - _ZSt19__once_functor_lock; - _ZSt16__get_once_mutexv; + _ZSt23__get_once_functor_lockv; __once_proxy; # condition_variable diff --git a/libstdc++-v3/include/std/mutex b/libstdc++-v3/include/std/mutex index 3a22aabcad1..f26acc02f4f 100644 --- a/libstdc++-v3/include/std/mutex +++ b/libstdc++-v3/include/std/mutex @@ -728,10 +728,9 @@ namespace std } #else extern function __once_functor; - extern unique_lock* __once_functor_lock; - extern mutex& - __get_once_mutex(); + extern unique_lock& + __get_once_functor_lock(); #endif extern "C" void __once_proxy(); @@ -746,13 +745,18 @@ namespace std __once_callable = &__bound_functor; __once_call = &__once_call_impl; #else - unique_lock __functor_lock(__get_once_mutex()); + unique_lock& __functor_lock = __get_once_functor_lock(); + __functor_lock.lock(); __once_functor = bind(__f, __args...); - __once_functor_lock = &__functor_lock; #endif int __e = __gthread_once(&(__once._M_once), &__once_proxy); +#ifndef _GLIBCXX_HAVE_TLS + if (__functor_lock) + __functor_lock.unlock(); +#endif + if (__e) __throw_system_error(__e); } diff --git a/libstdc++-v3/src/mutex.cc b/libstdc++-v3/src/mutex.cc index a9467c2acd0..e0a94892158 100644 --- a/libstdc++-v3/src/mutex.cc +++ b/libstdc++-v3/src/mutex.cc @@ -25,6 +25,18 @@ #include #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; function __once_functor; - unique_lock* __once_functor_lock; - - mutex& - __get_once_mutex() + unique_lock& + __get_once_functor_lock() { - static mutex once_mutex; - return once_mutex; + static unique_lock once_functor_lock(get_once_mutex(), defer_lock); + return once_functor_lock; } #endif @@ -59,7 +69,7 @@ namespace std { #ifndef _GLIBCXX_HAVE_TLS function __once_call = std::move(__once_functor); - __once_functor_lock->unlock(); + __get_once_functor_lock().unlock(); #endif __once_call(); } diff --git a/libstdc++-v3/testsuite/30_threads/call_once/call_once2.cc b/libstdc++-v3/testsuite/30_threads/call_once/call_once2.cc deleted file mode 100644 index aa125919bf8..00000000000 --- a/libstdc++-v3/testsuite/30_threads/call_once/call_once2.cc +++ /dev/null @@ -1,56 +0,0 @@ -// { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* alpha*-*-osf* mips-sgi-irix6* } } -// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* alpha*-*-osf* mips-sgi-irix6* } } -// { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } -// { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } -// { dg-require-cstdint "" } -// { dg-require-gthreads "" } - -// Copyright (C) 2009 Free Software Foundation, Inc. -// -// This file is part of the GNU ISO C++ Library. This library is free -// software; you can redistribute it and/or modify it under the -// terms of the GNU General Public License as published by the -// Free Software Foundation; either version 3, or (at your option) -// any later version. - -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING3. If not see -// . - - -#include -#include -#include - -std::once_flag flag; -int value = 0; - -struct Inc { void operator()() const { ++value; } }; - -struct Func -{ - void operator()() const - { - Inc inc; - for (int i = 0; i < 10000; ++i) - std::call_once(flag, inc); - } -}; - -int main() -{ - Func f; - std::thread t1(f); - std::thread t2(f); - std::thread t3(f); - t1.join(); - t2.join(); - t3.join(); - VERIFY( value == 1 ); - return 0; -}