/* * Copyright (c) 2021, kleines Filmröllchen . * Copyright (c) 2025, Ryszard Goc * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include namespace Sync { namespace { ALWAYS_INLINE pthread_cond_t* to_impl(void* ptr) { return reinterpret_cast(ptr); } } template requires Detail::IsIntraprocess && Detail::IsNonRecursive ConditionVariableBase::ConditionVariableBase(MutexType& to_wait_on) : m_to_wait_on(to_wait_on) { static_assert(sizeof(m_storage) == sizeof(pthread_cond_t)); int result = pthread_cond_init(to_impl(m_storage), nullptr); VERIFY(result == 0); } template requires Detail::IsIntraprocess && Detail::IsNonRecursive ConditionVariableBase::~ConditionVariableBase() { int result = pthread_cond_destroy(to_impl(m_storage)); VERIFY(result == 0); } template requires Detail::IsIntraprocess && Detail::IsNonRecursive void ConditionVariableBase::wait() { int result = pthread_cond_wait(to_impl(m_storage), reinterpret_cast(m_to_wait_on.m_storage)); VERIFY(result == 0); } template requires Detail::IsIntraprocess && Detail::IsNonRecursive void ConditionVariableBase::signal() { int result = pthread_cond_signal(to_impl(m_storage)); VERIFY(result == 0); } template requires Detail::IsIntraprocess && Detail::IsNonRecursive void ConditionVariableBase::broadcast() { int result = pthread_cond_broadcast(to_impl(m_storage)); VERIFY(result == 0); } template class SYNC_API ConditionVariableBase; }