/*** Copyright (C) 2021-2024 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: AuSemaphore.NT.hpp Date: 2021-6-12 Author: Reece ***/ #pragma once #include "AuConditionMutex.Generic.hpp" #include "AuConditionVariable.NT.hpp" namespace Aurora::Threading::Primitives { struct SemaphoreImpl final : ISemaphore { SemaphoreImpl(AuUInt16 uIntialValue = 0); ~SemaphoreImpl(); bool HasOSHandle(AuMach &mach) override; bool HasLockImplementation() override; bool TryLock() override; bool LockMS(AuUInt64 timeout) override; bool LockNS(AuUInt64 timeout) override; bool LockAbsNS(AuUInt64 qwTimeoutAbs) override; void Lock() override; void Unlock(AuUInt16 count) override; void Unlock() override; auline bool TryLockNoSpin(); auline bool TryLockHeavy(); auline AuUInt32 *GetSleepCounter(); private: AuAUInt32 dwState_ {}; ConditionMutexInternal mutex; ConditionVariableInternal var; }; }