/* * Copyright (c) 2025, Ryszard Goc * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include #include namespace Sync { namespace { ALWAYS_INLINE PCONDITION_VARIABLE 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) { InitializeConditionVariable(to_impl(m_storage)); } template requires Detail::IsIntraprocess && Detail::IsNonRecursive ConditionVariableBase::~ConditionVariableBase() = default; template<> void ConditionVariableBase::wait() { BOOL result = SleepConditionVariableSRW(to_impl(m_storage), reinterpret_cast(m_to_wait_on.m_storage), INFINITE, 0); if (!result) { warnln("SleepConditionVariableSRW failed with: {}", Error::from_windows_error()); VERIFY_NOT_REACHED(); } } template requires Detail::IsIntraprocess && Detail::IsNonRecursive void ConditionVariableBase::signal() { WakeConditionVariable(to_impl(m_storage)); } template requires Detail::IsIntraprocess && Detail::IsNonRecursive void ConditionVariableBase::broadcast() { WakeAllConditionVariable(to_impl(m_storage)); } template class SYNC_API ConditionVariableBase; }