/*** Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: ConditionVariable.hpp Date: 2021-6-9 Author: Reece ***/ #pragma once namespace Aurora::Threading::Primitives { /** A standard conditional variable tied to IConditionalMutex
Multiple conditionals may use a common IConditionalMutex.
Unlike the POSIX standard,
1) we define no waitable as illegal
2) conditional variables may not rebind their mutex */ struct IConditionVariable { /** * @brief Returns the mutex the condvar was bound to */ virtual AuSPtr GetMutex() = 0; /** * @brief * @param uTimeoutMS timeout in milliseconds or zero for an indefinite amount of time * @return */ virtual bool WaitForSignal(AuUInt32 uTimeoutMS = 0) = 0; /** * @brief * @param uTimeoutMS timeout in nanoseconds or zero for an indefinite amount of time * @return */ virtual bool WaitForSignalNS(AuUInt64 uTimeoutNS = 0) = 0; /** * @brief Wakes the count of currently sleeping threads without guaranteed respect for ordering. * Assuming correctness of your mutex paths, this will wake all threads up-to your everyone-be-alert condition. */ virtual void Broadcast() = 0; /** * @brief Schedules a single thread for wake up without guaranteed respect for ordering. */ virtual void Signal() = 0; }; AUKN_SHARED_SOO2_NCM(ConditionVariable, IConditionVariable, kPrimitiveSizeCond, ((const AuSPtr&, pMutex)), const AuSPtr &mutex); }