diff options
Diffstat (limited to 'libcxxabi/src/cxa_guard.cpp')
-rw-r--r-- | libcxxabi/src/cxa_guard.cpp | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/libcxxabi/src/cxa_guard.cpp b/libcxxabi/src/cxa_guard.cpp index e403b64abd5..b22fcbbd86e 100644 --- a/libcxxabi/src/cxa_guard.cpp +++ b/libcxxabi/src/cxa_guard.cpp @@ -8,8 +8,11 @@ //===----------------------------------------------------------------------===// #include "abort_message.h" +#include "config.h" -#include <pthread.h> +#if !LIBCXXABI_SINGLE_THREADED +# include <pthread.h> +#endif #include <stdint.h> /* @@ -59,8 +62,10 @@ void set_initialized(guard_type* guard_object) { #endif +#if !LIBCXXABI_SINGLE_THREADED pthread_mutex_t guard_mut = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t guard_cv = PTHREAD_COND_INITIALIZER; +#endif #if defined(__APPLE__) && !defined(__arm__) @@ -161,9 +166,27 @@ set_lock(uint32_t& x, lock_type y) extern "C" { +#if LIBCXXABI_SINGLE_THREADED +int __cxa_guard_acquire(guard_type* guard_object) +{ + return !is_initialized(guard_object); +} + +void __cxa_guard_release(guard_type* guard_object) +{ + *guard_object = 0; + set_initialized(guard_object); +} + +void __cxa_guard_abort(guard_type* guard_object) +{ + *guard_object = 0; +} + +#else // !LIBCXXABI_SINGLE_THREADED + int __cxa_guard_acquire(guard_type* guard_object) { - char* initialized = (char*)guard_object; if (pthread_mutex_lock(&guard_mut)) abort_message("__cxa_guard_acquire failed to acquire mutex"); int result = *initialized == 0; @@ -226,6 +249,8 @@ void __cxa_guard_abort(guard_type* guard_object) abort_message("__cxa_guard_abort failed to broadcast condition variable"); } +#endif // !LIBCXXABI_SINGLE_THREADED + } // extern "C" } // __cxxabiv1 |