[libcxx-commits] [libcxx] [libc++] Replace mutex+condvar with atomics in __call_once (PR #192433)
Nikolas Klauser via libcxx-commits
libcxx-commits at lists.llvm.org
Thu Apr 16 11:02:28 PDT 2026
================
@@ -42,27 +45,38 @@ void __call_once(volatile once_flag::_State_type& flag, void* arg, void (*func)(
#else // !_LIBCPP_HAS_THREADS
- __libcpp_mutex_lock(&mut);
- while (flag == once_flag::_Pending)
- __libcpp_condvar_wait(&cv, &mut);
- if (flag == once_flag::_Unset) {
- auto guard = std::__make_exception_guard([&flag] {
- __libcpp_mutex_lock(&mut);
- __libcpp_relaxed_store(&flag, once_flag::_Unset);
- __libcpp_mutex_unlock(&mut);
- __libcpp_condvar_broadcast(&cv);
- });
-
- __libcpp_relaxed_store(&flag, once_flag::_Pending);
- __libcpp_mutex_unlock(&mut);
- func(arg);
- __libcpp_mutex_lock(&mut);
- __libcpp_atomic_store(&flag, once_flag::_Complete, _AO_Release);
- __libcpp_mutex_unlock(&mut);
- __libcpp_condvar_broadcast(&cv);
- guard.__complete();
- } else {
- __libcpp_mutex_unlock(&mut);
+ auto flag_read = __atomic_load_n(&flag, __ATOMIC_ACQUIRE);
----------------
philnik777 wrote:
Can we just use `std::atomic` instead? I don't think there is a reason we can't and that's way nicer to read and easier to understand.
https://github.com/llvm/llvm-project/pull/192433
More information about the libcxx-commits
mailing list