/*** Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: ConditionEx.hpp Date: 2021-6-11 Author: Reece ***/ #pragma once namespace Aurora::Threading::Primitives { /** A comprehensive CV that does not strictly abide by typical assumptions.
This object depends on the synchronization of primitives within our abstraction layer rather than the OS's implementation of condition variables.
Note: Missing 'pWaitable's cannnot serve as an `atomic wait for while is [not] value` operation. There are no legal use cases for this feature. It's just there. */ struct ConditionEx { virtual void WaitForSignal() = 0; virtual void WaitForSignal(IWaitable *pWaitable) = 0; virtual void WaitForSignal(const AuSPtr &pWaitable) = 0; virtual bool WaitForSignalNS(AuUInt64 uRelativeNanoseconds) = 0; virtual bool WaitForSignalNS(IWaitable *pWaitable, AuUInt64 uRelativeNanoseconds) = 0; virtual bool WaitForSignalNS(const AuSPtr &pWaitable, AuUInt64 uRelativeNanoseconds) = 0; virtual void Broadcast() = 0; virtual void Signal() = 0; }; AUKN_SHARED_SOO_NCM(FlexibleConditionVariable, ConditionEx, kPrimitiveSizeSemaphoreCV); }