/*** Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: BooleanWaitable.hpp Date: 2021-6-10 Author: Reece ***/ #pragma once #include "../WakeOnAddress.hpp" namespace Aurora::Threading::Waitables { struct BooleanWaitable : IWaitable { inline BooleanWaitable(bool *pValue) : pValue_(pValue) { } inline BooleanWaitable(bool &refValue) : pValue_(&refValue) { } inline BooleanWaitable(std::atomic &value) : pValue_((bool *)&value) { } inline bool TryLock() override { return this->pValue_ ? *this->pValue_ : true; } inline bool HasOSHandle(AuMach &mach) override { return false; } inline bool HasLockImplementation() override { return true; } inline void Unlock() override { if (!this->pValue_) { return; } WakeOnAddress(this->pValue_); } inline void Lock() override { if (!this->pValue_) { return; } AuUInt8 uRef { 1 }; WaitOnAddress(this->pValue_, &uRef, 1, 0); } inline bool LockMS(AuUInt64 qwTimeout) override { return LockNS(AuMSToNS(qwTimeout)); } inline bool LockNS(AuUInt64 qwTimeout) override { AuUInt8 uRef { 1 }; if (!this->pValue_) { return false; } return WaitOnAddress(this->pValue_, &uRef, 1, qwTimeout); } private: bool *pValue_ {}; }; }