| //===---------------------------- cxa_guard.cpp ---------------------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // Tell the implementation that we're building the actual implementation | |
| // (and not testing it) | |
| /* | |
| 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 { | |
| using guard_type = uint32_t; | |
| using guard_type = uint64_t; | |
| 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 | |