N3189 Observers for the three handler functions

llvm-svn: 120712
Cr-Mirrored-From: sso://chromium.googlesource.com/_direct/external/github.com/llvm/llvm-project
Cr-Mirrored-Commit: 1596c4531b3950f4c883013cb51182ad40884633
diff --git a/src/exception.cpp b/src/exception.cpp
index 1ab5a19..062114c 100644
--- a/src/exception.cpp
+++ b/src/exception.cpp
@@ -26,9 +26,13 @@
 std::unexpected_handler
 std::set_unexpected(std::unexpected_handler func) throw()
 {
-    std::terminate_handler old = __unexpected_handler;
-    __unexpected_handler = func;
-    return old;
+    return __sync_lock_test_and_set(&__unexpected_handler, func);
+}
+
+std::unexpected_handler
+std::get_unexpected() throw()
+{
+    return __sync_fetch_and_add(&__unexpected_handler, (std::unexpected_handler)0);
 }
 
 void
@@ -42,9 +46,13 @@
 std::terminate_handler
 std::set_terminate(std::terminate_handler func) throw()
 {
-    std::terminate_handler old = __terminate_handler;
-    __terminate_handler = func;
-    return old;
+    return __sync_lock_test_and_set(&__terminate_handler, func);
+}
+
+std::terminate_handler
+std::get_terminate() throw()
+{
+    return __sync_fetch_and_add(&__terminate_handler, (std::terminate_handler)0);
 }
 
 void
diff --git a/src/new.cpp b/src/new.cpp
index 874ad6c..a3783d4 100644
--- a/src/new.cpp
+++ b/src/new.cpp
@@ -130,9 +130,13 @@
 new_handler
 set_new_handler(new_handler handler) throw()
 {
-    new_handler r = __new_handler;
-    __new_handler = handler;
-    return r;
+    return __sync_lock_test_and_set(&__new_handler, handler);
+}
+
+new_handler
+get_new_handler() throw()
+{
+    return __sync_fetch_and_add(&__new_handler, (new_handler)0);
 }
 
 bad_alloc::bad_alloc() throw()