mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-15 05:10:27 +08:00
2009-04-26 Paolo Carlini <paolo.carlini@oracle.com>
Revert the last commit. From-SVN: r146796
This commit is contained in:
parent
e8f99a9d26
commit
cca36d72b9
@ -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):
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user