diff options
-rw-r--r-- | libcxxabi/src/cxa_guard.cpp | 52 |
1 files changed, 19 insertions, 33 deletions
diff --git a/libcxxabi/src/cxa_guard.cpp b/libcxxabi/src/cxa_guard.cpp index 7c85d8ae294..e606665acc8 100644 --- a/libcxxabi/src/cxa_guard.cpp +++ b/libcxxabi/src/cxa_guard.cpp @@ -9,7 +9,6 @@ #include "__cxxabi_config.h" #include "abort_message.h" -#include "include/atomic_support.h" #include <__threading_support> #include <stdint.h> @@ -156,18 +155,13 @@ private: struct GuardObject { explicit GuardObject(guard_type *g) : guard(g) {} - /// Load the current value from the guard object. - GuardValue load() const; + // Read the current value of the guard object. + // TODO: Make this read atomic. + GuardValue read() const; - /// Store the specified value in the guard object. - void store(GuardValue new_val); - - /// Store the specified value in the guard object and return the previous value. - GuardValue exchange(GuardValue new_val); - - /// Perform a atomic compare and exchange operation. Return true if - // desired is written to the guard object. - bool compare_exchange(GuardValue *expected, GuardValue desired); + // Write the specified value to the guard object. + // TODO: Make this atomic + void write(GuardValue new_val); private: GuardObject(const GuardObject&) = delete; @@ -184,7 +178,7 @@ extern "C" _LIBCXXABI_FUNC_VIS int __cxa_guard_acquire(guard_type* raw_guard_object) { GlobalMutexGuard gmutex("__cxa_guard_acquire", OnRelease::UNLOCK); GuardObject guard(raw_guard_object); - GuardValue current_value = guard.load(); + GuardValue current_value = guard.read(); if (current_value.is_initialization_complete()) return INIT_COMPLETE; @@ -198,12 +192,12 @@ _LIBCXXABI_FUNC_VIS int __cxa_guard_acquire(guard_type* raw_guard_object) { #endif while (current_value.is_initialization_pending()) { gmutex.wait_for_signal(); - current_value = guard.load(); + current_value = guard.read(); } if (current_value.is_initialization_complete()) return INIT_COMPLETE; - guard.store(LOCK_ID); + guard.write(LOCK_ID); return INIT_NOT_COMPLETE; } @@ -211,13 +205,14 @@ _LIBCXXABI_FUNC_VIS void __cxa_guard_release(guard_type *raw_guard_object) { GlobalMutexGuard gmutex("__cxa_guard_release", OnRelease::UNLOCK_AND_BROADCAST); GuardObject guard(raw_guard_object); - guard.store(GuardValue::INIT_COMPLETE()); + guard.write(GuardValue::ZERO()); + guard.write(GuardValue::INIT_COMPLETE()); } _LIBCXXABI_FUNC_VIS void __cxa_guard_abort(guard_type *raw_guard_object) { GlobalMutexGuard gmutex("__cxa_guard_abort", OnRelease::UNLOCK_AND_BROADCAST); GuardObject guard(raw_guard_object); - guard.store(GuardValue::ZERO()); + guard.write(GuardValue::ZERO()); } } // extern "C" @@ -225,26 +220,17 @@ _LIBCXXABI_FUNC_VIS void __cxa_guard_abort(guard_type *raw_guard_object) { // GuardObject Definitions //===----------------------------------------------------------------------===// -GuardValue GuardObject::load() const { - return GuardValue(std::__libcpp_atomic_load(guard)); -} - -void GuardObject::store(GuardValue new_val) { - std::__libcpp_atomic_store(guard, new_val.value); +GuardValue GuardObject::read() const { + // FIXME: Make this atomic + guard_type val = *guard; + return GuardValue(val); } -GuardValue GuardObject::exchange(GuardValue new_val) { - return GuardValue( - std::__libcpp_atomic_exchange(guard, new_val.value, std::_AO_Acq_Rel)); +void GuardObject::write(GuardValue new_val) { + // FIXME: make this atomic + *guard = new_val.value; } -bool GuardObject::compare_exchange(GuardValue* expected, - GuardValue desired) { - return std::__libcpp_atomic_compare_exchange(guard, &expected->value, desired.value, - std::_AO_Acq_Rel, std::_AO_Acquire); -} - - //===----------------------------------------------------------------------===// // GuardValue Definitions //===----------------------------------------------------------------------===// |