| //===---------------------------- cxa_guard.cpp ---------------------------===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is dual licensed under the MIT and the University of Illinois Open |
| // Source Licenses. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "__cxxabi_config.h" |
| #include "cxxabi.h" |
| |
| // Tell the implementation that we're building the actual implementation |
| // (and not testing it) |
| #define BUILDING_CXA_GUARD |
| #include "cxa_guard_impl.h" |
| |
| /* |
| This implementation must be careful to not call code external to this file |
| which will turn around and try to call __cxa_guard_acquire reentrantly. |
| For this reason, the headers of this file are as restricted as possible. |
| Previous implementations of this code for __APPLE__ have used |
| std::__libcpp_mutex_lock and the abort_message utility without problem. This |
| implementation also uses std::__libcpp_condvar_wait which has tested |
| to not be a problem. |
| */ |
| |
| namespace __cxxabiv1 { |
| |
| #if defined(_LIBCXXABI_GUARD_ABI_ARM) |
| using guard_type = uint32_t; |
| #else |
| using guard_type = uint64_t; |
| #endif |
| |
| extern "C" |
| { |
| _LIBCXXABI_FUNC_VIS int __cxa_guard_acquire(guard_type* raw_guard_object) { |
| SelectedImplementation imp(raw_guard_object); |
| return static_cast<int>(imp.cxa_guard_acquire()); |
| } |
| |
| _LIBCXXABI_FUNC_VIS void __cxa_guard_release(guard_type *raw_guard_object) { |
| SelectedImplementation imp(raw_guard_object); |
| imp.cxa_guard_release(); |
| } |
| |
| _LIBCXXABI_FUNC_VIS void __cxa_guard_abort(guard_type *raw_guard_object) { |
| SelectedImplementation imp(raw_guard_object); |
| imp.cxa_guard_abort(); |
| } |
| } // extern "C" |
| |
| } // __cxxabiv1 |