diff --git a/libcxxabi/src/cxa_guard_impl.h b/libcxxabi/src/cxa_guard_impl.h --- a/libcxxabi/src/cxa_guard_impl.h +++ b/libcxxabi/src/cxa_guard_impl.h @@ -589,6 +589,26 @@ } }; +//===----------------------------------------------------------------------===// +// Convenience Classes +//===----------------------------------------------------------------------===// + +/// NoThreadsGuard - Manages initialization without performing any inter-thread +/// synchronization. +using NoThreadsGuard = GuardObject; + +/// GlobalMutexGuard - Manages initialization using a global mutex and +/// condition variable. +template +using GlobalMutexGuard = GuardObject>; + +/// FutexGuard - Manages initialization using atomics and the futex syscall for +/// waiting and waking. +template +using FutexGuard = GuardObject>; + //===----------------------------------------------------------------------===// // //===----------------------------------------------------------------------===// @@ -605,23 +625,20 @@ template struct SelectImplementation; -/// Manage initialization without performing any inter-thread synchronization. template <> struct SelectImplementation { - using type = GuardObject; + using type = NoThreadsGuard; }; -/// Manage initialization using a global mutex and condition variable. template <> struct SelectImplementation { - using type = GuardObject::instance, - GlobalStatic::instance, PlatformThreadID>>; + using type = GlobalMutexGuard::instance, + GlobalStatic::instance, PlatformThreadID>; }; -/// Manage initialization using atomics and the futex syscall for waiting and waking. template <> struct SelectImplementation { - using type = GuardObject>; + using type = FutexGuard; }; // TODO(EricWF): We should prefer the futex implementation when available. But diff --git a/libcxxabi/test/guard_test_basic.pass.cpp b/libcxxabi/test/guard_test_basic.pass.cpp --- a/libcxxabi/test/guard_test_basic.pass.cpp +++ b/libcxxabi/test/guard_test_basic.pass.cpp @@ -119,14 +119,13 @@ { #if defined(_LIBCXXABI_HAS_NO_THREADS) static_assert(CurrentImplementation == Implementation::NoThreads, ""); - static_assert(std::is_same>::value, ""); + static_assert(std::is_same::value, ""); #else static_assert(CurrentImplementation == Implementation::GlobalMutex, ""); - static_assert( - std::is_same::instance, - GlobalStatic::instance>>>::value, - ""); + static_assert(std::is_same::instance, + GlobalStatic::instance>>::value, + ""); #endif } { @@ -139,17 +138,16 @@ } } { - Tests>::test(); - Tests>::test(); + Tests::test(); + Tests::test(); } { - using MutexImpl = - GuardObject>; + using MutexImpl = GlobalMutexGuard; Tests::test(); Tests::test(); } { - using FutexImpl = GuardObject>; + using FutexImpl = FutexGuard<&NopFutexWait, &NopFutexWake, &MockGetThreadID>; Tests::test(); Tests::test(); }