aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2009-04-26 10:12:08 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2009-04-26 10:12:08 +0000
commitcca36d72b941a1d02cfbcf0eebe5113c906222f5 (patch)
tree110bbbb31639b9fd945721ee33931e8b8e13ef2c
parente8f99a9d265e068c5748949970db24daf3a928b1 (diff)
downloadgcc-cca36d72b941a1d02cfbcf0eebe5113c906222f5.zip
gcc-cca36d72b941a1d02cfbcf0eebe5113c906222f5.tar.gz
gcc-cca36d72b941a1d02cfbcf0eebe5113c906222f5.tar.bz2
2009-04-26 Paolo Carlini <paolo.carlini@oracle.com>
Revert the last commit. From-SVN: r146796
-rw-r--r--libstdc++-v3/ChangeLog4
-rw-r--r--libstdc++-v3/config/abi/pre/gnu.ver3
-rw-r--r--libstdc++-v3/include/std/mutex14
-rw-r--r--libstdc++-v3/src/mutex.cc24
-rw-r--r--libstdc++-v3/testsuite/30_threads/call_once/call_once2.cc56
5 files changed, 31 insertions, 70 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 60f7ef2..970e167 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,7 @@
+2009-04-26 Paolo Carlini <paolo.carlini@oracle.com>
+
+ Revert the last commit.
+
2009-04-25 Jonathan Wakely <jwakely.gcc@gmail.com>
* 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 bd2c63e..57183c1 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 3a22aab..f26acc0 100644
--- a/libstdc++-v3/include/std/mutex
+++ b/libstdc++-v3/include/std/mutex
@@ -728,10 +728,9 @@ namespace std
}
#else
extern function<void()> __once_functor;
- extern unique_lock<mutex>* __once_functor_lock;
- extern mutex&
- __get_once_mutex();
+ extern unique_lock<mutex>&
+ __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<decltype(__bound_functor)>;
#else
- unique_lock<mutex> __functor_lock(__get_once_mutex());
+ unique_lock<mutex>& __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 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();
}
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 aa12591..0000000
--- 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
-// <http://www.gnu.org/licenses/>.
-
-
-#include <mutex>
-#include <thread>
-#include <testsuite_hooks.h>
-
-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;
-}