diff options
-rw-r--r-- | src/cxa_default_handlers.cpp | 10 | ||||
-rw-r--r-- | src/cxa_handlers.cpp | 19 | ||||
-rw-r--r-- | src/cxa_handlers.hpp | 14 |
3 files changed, 39 insertions, 4 deletions
diff --git a/src/cxa_default_handlers.cpp b/src/cxa_default_handlers.cpp index 726f7eb..8c25b72 100644 --- a/src/cxa_default_handlers.cpp +++ b/src/cxa_default_handlers.cpp @@ -94,6 +94,10 @@ static void default_unexpected_handler() std::terminate_handler __cxa_terminate_handler = default_terminate_handler; std::unexpected_handler __cxa_unexpected_handler = default_unexpected_handler; +// In the future these will become: +// std::atomic<std::terminate_handler> __cxa_terminate_handler(default_terminate_handler); +// std::atomic<std::unexpected_handler> __cxa_unexpected_handler(default_unexpected_handler); + namespace std { @@ -103,6 +107,8 @@ set_unexpected(unexpected_handler func) _NOEXCEPT if (func == 0) func = default_unexpected_handler; return __sync_swap(&__cxa_unexpected_handler, func); +// Using of C++11 atomics this should be rewritten +// return __cxa_unexpected_handler.exchange(func, memory_order_acq_rel); } terminate_handler @@ -111,6 +117,8 @@ set_terminate(terminate_handler func) _NOEXCEPT if (func == 0) func = default_terminate_handler; return __sync_swap(&__cxa_terminate_handler, func); +// Using of C++11 atomics this should be rewritten +// return __cxa_terminate_handler.exchange(func, memory_order_acq_rel); } -}; +} diff --git a/src/cxa_handlers.cpp b/src/cxa_handlers.cpp index 3150c0a..100fc50 100644 --- a/src/cxa_handlers.cpp +++ b/src/cxa_handlers.cpp @@ -25,7 +25,10 @@ namespace std unexpected_handler get_unexpected() _NOEXCEPT { - return __cxa_unexpected_handler; + return __sync_fetch_and_add(&__cxa_unexpected_handler, (unexpected_handler)0); +// The above is safe but overkill on x86 +// Using of C++11 atomics this should be rewritten +// return __cxa_unexpected_handler.load(memory_order_acq); } __attribute__((visibility("hidden"), noreturn)) @@ -47,7 +50,10 @@ unexpected() terminate_handler get_terminate() _NOEXCEPT { - return __cxa_terminate_handler; + return __sync_fetch_and_add(&__cxa_terminate_handler, (terminate_handler)0); +// The above is safe but overkill on x86 +// Using of C++11 atomics this should be rewritten +// return __cxa_terminate_handler.load(memory_order_acq); } __attribute__((visibility("hidden"), noreturn)) @@ -96,17 +102,24 @@ terminate() _NOEXCEPT } new_handler __cxa_new_handler = 0; +// In the future these will become: +// std::atomic<std::new_handler> __cxa_new_handler(0); new_handler set_new_handler(new_handler handler) _NOEXCEPT { return __sync_swap(&__cxa_new_handler, handler); +// Using of C++11 atomics this should be rewritten +// return __cxa_new_handler.exchange(handler, memory_order_acq_rel); } new_handler get_new_handler() _NOEXCEPT { - return __cxa_new_handler; + return __sync_fetch_and_add(&__cxa_new_handler, (new_handler)0); +// The above is safe but overkill on x86 +// Using of C++11 atomics this should be rewritten +// return __cxa_new_handler.load(memory_order_acq); } } // std diff --git a/src/cxa_handlers.hpp b/src/cxa_handlers.hpp index 95a320d..64994ac 100644 --- a/src/cxa_handlers.hpp +++ b/src/cxa_handlers.hpp @@ -35,6 +35,20 @@ extern void (*__cxa_terminate_handler)(); extern void (*__cxa_unexpected_handler)(); extern void (*__cxa_new_handler)(); +/* + + At some point in the future these three symbols will become + C++11 atomic variables: + + extern std::atomic<std::terminate_handler> __cxa_terminate_handler; + extern std::atomic<std::unexpected_handler> __cxa_unexpected_handler; + extern std::atomic<std::new_handler> __cxa_new_handler; + + This change will not impact their ABI. But it will allow for a + portible performance optimization. + +*/ + } // extern "C" #endif // _CXA_HANDLERS_H |