From 3dd808fe94257bf7e8af0f30efa8ed5f510fe66b Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Sun, 26 Aug 2012 13:49:44 +0000 Subject: [PATCH] re PR libstdc++/54297 ([C++11] Segmentation fault with std::async and released shared state) PR libstdc++/54297 * src/c++11/future.cc (~_Async_state_common): Move to... * src/c++11/compatibility-thread-c++0x.cc (~_Async_state_common): Here. (_GLIBCXX_ABI_COMPAT_ASYNC): Rename to _GLIBCXX_ASYNC_ABI_COMPAT. * include/std/future (_GLIBCXX_ABI_COMPAT_ASYNC): Likewise. From-SVN: r190685 --- libstdc++-v3/ChangeLog | 9 +++++++ libstdc++-v3/include/std/future | 2 +- .../src/c++11/compatibility-thread-c++0x.cc | 27 ++++++++++++++++++- libstdc++-v3/src/c++11/future.cc | 11 -------- 4 files changed, 36 insertions(+), 13 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 0bd863bf798..88b4848c2cb 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,12 @@ +2012-08-26 Jonathan Wakely + + PR libstdc++/54297 + * src/c++11/future.cc (~_Async_state_common): Move to... + * src/c++11/compatibility-thread-c++0x.cc (~_Async_state_common): + Here. + (_GLIBCXX_ABI_COMPAT_ASYNC): Rename to _GLIBCXX_ASYNC_ABI_COMPAT. + * include/std/future (_GLIBCXX_ABI_COMPAT_ASYNC): Likewise. + 2012-08-26 Jonathan Wakely Geoff Romer diff --git a/libstdc++-v3/include/std/future b/libstdc++-v3/include/std/future index feae382fe00..9568192e5c4 100644 --- a/libstdc++-v3/include/std/future +++ b/libstdc++-v3/include/std/future @@ -1427,7 +1427,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION class __future_base::_Async_state_common : public __future_base::_State_base { protected: -#if defined(_GLIBCXX_HAVE_TLS) && defined(_GLIBCXX_ABI_COMPAT_ASYNC) +#ifdef _GLIBCXX_ASYNC_ABI_COMPAT ~_Async_state_common(); #else ~_Async_state_common() = default; diff --git a/libstdc++-v3/src/c++11/compatibility-thread-c++0x.cc b/libstdc++-v3/src/c++11/compatibility-thread-c++0x.cc index cc8761eea15..e5c7eec419e 100644 --- a/libstdc++-v3/src/c++11/compatibility-thread-c++0x.cc +++ b/libstdc++-v3/src/c++11/compatibility-thread-c++0x.cc @@ -22,11 +22,16 @@ // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see // . +#include +#if defined(_GLIBCXX_HAVE_TLS) && defined(PIC) +#define _GLIBCXX_ASYNC_ABI_COMPAT +#endif + #include #include #ifndef __GXX_EXPERIMENTAL_CXX0X__ -# error "compatibility-c++0x.cc must be compiled with -std=gnu++0x" +# error "compatibility-thread-c++0x.cc must be compiled with -std=gnu++0x" #endif #define _GLIBCXX_ASM_SYMVER(cur, old, version) \ @@ -70,3 +75,23 @@ _GLIBCXX_ASM_SYMVER(_ZN9__gnu_cxx11try_to_lockE, _ZSt11try_to_lock, GLIBCXX_3.4. #endif #endif // _GLIBCXX_HAS_GTHREADS && _GLIBCXX_USE_C99_STDINT_TR1 + + +// XXX GLIBCXX_ABI Deprecated +// gcc-4.7.0 +// export changes +#if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1) \ + && (ATOMIC_INT_LOCK_FREE > 1) +#if defined(_GLIBCXX_HAVE_TLS) && defined(PIC) +namespace std _GLIBCXX_VISIBILITY(default) +{ +_GLIBCXX_BEGIN_NAMESPACE_VERSION + __future_base::_Async_state_common::~_Async_state_common() { _M_join(); } + + // Explicit instantiation due to -fno-implicit-instantiation. + template void call_once(once_flag&, void (thread::*&&)(), reference_wrapper&&); + template _Bind_simple_helper>::__type __bind_simple(void (thread::*&&)(), reference_wrapper&&); +_GLIBCXX_END_NAMESPACE_VERSION +} // namespace std +#endif +#endif // _GLIBCXX_HAS_GTHREADS && _GLIBCXX_USE_C99_STDINT_TR1 diff --git a/libstdc++-v3/src/c++11/future.cc b/libstdc++-v3/src/c++11/future.cc index eaea39375e7..05525372618 100644 --- a/libstdc++-v3/src/c++11/future.cc +++ b/libstdc++-v3/src/c++11/future.cc @@ -22,8 +22,6 @@ // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see // . -#define _GLIBCXX_ABI_COMPAT_ASYNC - #include namespace @@ -86,15 +84,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __future_base::_Result_base::~_Result_base() = default; __future_base::_State_base::~_State_base() = default; - -#ifdef _GLIBCXX_HAVE_TLS - // Exported for compatibility with ABI version 3.4.17 - __future_base::_Async_state_common::~_Async_state_common() { _M_join(); } - - // Explicit instantiation due to -fno-implicit-instantiation. - template void call_once(once_flag&, void (thread::*&&)(), reference_wrapper&&); - template _Bind_simple_helper>::__type __bind_simple(void (thread::*&&)(), reference_wrapper&&); -#endif #endif _GLIBCXX_END_NAMESPACE_VERSION