/* * Copyright (c) 2025, Ryszard Goc * * SPDX-License-Identifier: BSD-2-Clause */ #include #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<> bool ConditionVariableBase::wait_for(AK::Duration const& timeout) { if (timeout <= AK::Duration::zero()) return false; auto timeout_ms = timeout.to_milliseconds(); VERIFY(timeout_ms >= 0); auto result = SleepConditionVariableSRW(to_impl(m_storage), reinterpret_cast(m_to_wait_on.m_storage), static_cast(min(timeout_ms, INFINITE - 1)), 0); if (result) return true; auto error = GetLastError(); if (error == ERROR_TIMEOUT) return false; warnln("SleepConditionVariableSRW failed with: {}", Error::from_windows_error(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; }