/*** Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: AuConditionVariable.Win32.cpp Date: 2021-6-12 Author: Reece ***/ #include #include "AuConditionVariable.Generic.hpp" #if !defined(_AURUNTIME_GENERICCV) namespace Aurora::Threading::Primitives { ConditionVariableImpl::ConditionVariableImpl(const AuSPtr &pMutex) : mutex_(AuDynamicCast(pMutex)) { InitializeConditionVariable(&this->winCond_); } AuSPtr ConditionVariableImpl::GetMutex() { return mutex_; } bool ConditionVariableImpl::WaitForSignal(AuUInt32 uTimeout) { auto ok = SleepConditionVariableSRW(&this->winCond_, reinterpret_cast(this->mutex_->GetOSHandle()), uTimeout ? uTimeout : INFINITE, 0); if (!ok) { SysAssert(GetLastError() == ERROR_TIMEOUT, "SleepConditionVariable failure"); return false; } return true; } void ConditionVariableImpl::Signal() { WakeConditionVariable(&this->winCond_); } void ConditionVariableImpl::Broadcast() { WakeAllConditionVariable(&this->winCond_); } AUKN_SYM IConditionVariable *ConditionVariableNew(const AuSPtr &pMutex) { return _new ConditionVariableImpl(pMutex); } AUKN_SYM void ConditionVariableRelease(IConditionVariable *pCV) { AuSafeDelete(pCV); } } #endif