diff options
author | redi <redi@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-04-05 10:03:04 +0000 |
---|---|---|
committer | redi <redi@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-04-05 10:03:04 +0000 |
commit | 257b4f53888b78f70f0d201d2b1d3c4abcecf9d8 (patch) | |
tree | 2b3dd0c1dfe48cc07dd8c4ecc3ce2433b45844d4 | |
parent | 224959cbe4bf9b553546b8bb9d273f84821c286c (diff) | |
download | gcc-257b4f53888b78f70f0d201d2b1d3c4abcecf9d8.tar.gz |
PR libstdc++/56841
* libsupc++/eh_ptr.cc (rethrow_exception): Use get_unexpected() and
get_terminate() accessors.
* libsupc++/eh_throw.cc (__cxa_throw): Likewise.
* libsupc++/eh_terminate.cc: Use mutex when atomic builtins not
available.
* libsupc++/new_handler.cc: Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@197512 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | libstdc++-v3/ChangeLog | 10 | ||||
-rw-r--r-- | libstdc++-v3/libsupc++/eh_ptr.cc | 4 | ||||
-rw-r--r-- | libstdc++-v3/libsupc++/eh_terminate.cc | 31 | ||||
-rw-r--r-- | libstdc++-v3/libsupc++/eh_throw.cc | 4 | ||||
-rw-r--r-- | libstdc++-v3/libsupc++/new_handler.cc | 20 |
5 files changed, 65 insertions, 4 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 2536dfb181b..bbd285c4069 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,13 @@ +2013-04-05 Jonathan Wakely <jwakely.gcc@gmail.com> + + PR libstdc++/56841 + * libsupc++/eh_ptr.cc (rethrow_exception): Use get_unexpected() and + get_terminate() accessors. + * libsupc++/eh_throw.cc (__cxa_throw): Likewise. + * libsupc++/eh_terminate.cc: Use mutex when atomic builtins not + available. + * libsupc++/new_handler.cc: Likewise. + 2013-04-04 Jonathan Wakely <jwakely.gcc@gmail.com> * testsuite/util/testsuite_abi.cc: Add GLIBCXX_3.4.19 version. diff --git a/libstdc++-v3/libsupc++/eh_ptr.cc b/libstdc++-v3/libsupc++/eh_ptr.cc index f0183cee726..6bc3311020c 100644 --- a/libstdc++-v3/libsupc++/eh_ptr.cc +++ b/libstdc++-v3/libsupc++/eh_ptr.cc @@ -212,8 +212,8 @@ std::rethrow_exception(std::exception_ptr ep) dep->primaryException = obj; __atomic_add_fetch (&eh->referenceCount, 1, __ATOMIC_ACQ_REL); - dep->unexpectedHandler = __unexpected_handler; - dep->terminateHandler = __terminate_handler; + dep->unexpectedHandler = get_unexpected (); + dep->terminateHandler = get_terminate (); __GXX_INIT_DEPENDENT_EXCEPTION_CLASS(dep->unwindHeader.exception_class); dep->unwindHeader.exception_cleanup = __gxx_dependent_exception_cleanup; diff --git a/libstdc++-v3/libsupc++/eh_terminate.cc b/libstdc++-v3/libsupc++/eh_terminate.cc index bc38e1d201d..b31d2e27f05 100644 --- a/libstdc++-v3/libsupc++/eh_terminate.cc +++ b/libstdc++-v3/libsupc++/eh_terminate.cc @@ -27,6 +27,15 @@ #include <cstdlib> #include "unwind-cxx.h" #include <bits/exception_defines.h> +#include <bits/atomic_lockfree_defines.h> + +#if ATOMIC_POINTER_LOCK_FREE < 2 +#include <ext/concurrence.h> +namespace +{ + __gnu_cxx::__mutex mx; +} +#endif using namespace __cxxabiv1; @@ -65,7 +74,13 @@ std::terminate_handler std::set_terminate (std::terminate_handler func) throw() { std::terminate_handler old; +#if ATOMIC_POINTER_LOCK_FREE > 1 __atomic_exchange (&__terminate_handler, &func, &old, __ATOMIC_ACQ_REL); +#else + __gnu_cxx::__scoped_lock l(mx); + old = __terminate_handler; + __terminate_handler = func; +#endif return old; } @@ -73,7 +88,12 @@ std::terminate_handler std::get_terminate () noexcept { std::terminate_handler func; +#if ATOMIC_POINTER_LOCK_FREE > 1 __atomic_load (&__terminate_handler, &func, __ATOMIC_ACQUIRE); +#else + __gnu_cxx::__scoped_lock l(mx); + func = __terminate_handler; +#endif return func; } @@ -81,7 +101,13 @@ std::unexpected_handler std::set_unexpected (std::unexpected_handler func) throw() { std::unexpected_handler old; +#if ATOMIC_POINTER_LOCK_FREE > 1 __atomic_exchange (&__unexpected_handler, &func, &old, __ATOMIC_ACQ_REL); +#else + __gnu_cxx::__scoped_lock l(mx); + old = __unexpected_handler; + __unexpected_handler = func; +#endif return old; } @@ -89,6 +115,11 @@ std::unexpected_handler std::get_unexpected () noexcept { std::unexpected_handler func; +#if ATOMIC_POINTER_LOCK_FREE > 1 __atomic_load (&__unexpected_handler, &func, __ATOMIC_ACQUIRE); +#else + __gnu_cxx::__scoped_lock l(mx); + func = __unexpected_handler; +#endif return func; } diff --git a/libstdc++-v3/libsupc++/eh_throw.cc b/libstdc++-v3/libsupc++/eh_throw.cc index a79a025af19..5d376983215 100644 --- a/libstdc++-v3/libsupc++/eh_throw.cc +++ b/libstdc++-v3/libsupc++/eh_throw.cc @@ -68,8 +68,8 @@ __cxxabiv1::__cxa_throw (void *obj, std::type_info *tinfo, header->referenceCount = 1; header->exc.exceptionType = tinfo; header->exc.exceptionDestructor = dest; - header->exc.unexpectedHandler = __unexpected_handler; - header->exc.terminateHandler = __terminate_handler; + header->exc.unexpectedHandler = std::get_unexpected (); + header->exc.terminateHandler = std::get_terminate (); __GXX_INIT_PRIMARY_EXCEPTION_CLASS(header->exc.unwindHeader.exception_class); header->exc.unwindHeader.exception_cleanup = __gxx_exception_cleanup; diff --git a/libstdc++-v3/libsupc++/new_handler.cc b/libstdc++-v3/libsupc++/new_handler.cc index 2f6bb5e46c1..5253cfda7a0 100644 --- a/libstdc++-v3/libsupc++/new_handler.cc +++ b/libstdc++-v3/libsupc++/new_handler.cc @@ -24,6 +24,15 @@ // <http://www.gnu.org/licenses/>. #include "new" +#include <bits/atomic_lockfree_defines.h> + +#if ATOMIC_POINTER_LOCK_FREE < 2 +#include <ext/concurrence.h> +namespace +{ + __gnu_cxx::__mutex mx; +} +#endif const std::nothrow_t std::nothrow = { }; @@ -37,8 +46,14 @@ new_handler std::set_new_handler (new_handler handler) throw() { new_handler prev_handler; +#if ATOMIC_POINTER_LOCK_FREE > 1 __atomic_exchange (&__new_handler, &handler, &prev_handler, __ATOMIC_ACQ_REL); +#else + __gnu_cxx::__scoped_lock l(mx); + prev_handler = __new_handler; + __new_handler = handler; +#endif return prev_handler; } @@ -46,6 +61,11 @@ new_handler std::get_new_handler () noexcept { new_handler handler; +#if ATOMIC_POINTER_LOCK_FREE > 1 __atomic_load (&__new_handler, &handler, __ATOMIC_ACQUIRE); +#else + __gnu_cxx::__scoped_lock l(mx); + handler = __new_handler; +#endif return handler; } |