/*** Copyright (C) 2023 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: LSLocalSemaphore.hpp Date: 2023-10-21 Author: Reece ***/ #pragma once #include "LSSemaphore.hpp" namespace Aurora::IO::Loop { struct LSLocalSemaphore : LSSemaphore { LSLocalSemaphore(); ~LSLocalSemaphore(); bool TryInit(AuUInt32 initialCount, AuUInt32 uMaxCount = 0); bool IsSignaled() override; bool IsSignaledNoSpinIfUserland() override; ELoopSource GetType() override; bool AddOne() override; bool AddMany(AuUInt32 uCount) override; virtual bool OnTrigger(AuUInt handle) override; bool TryTakeNoSpin(); bool TryTakeSpin(); bool TryTake(); bool TryTakeWaitNS(AuUInt64 timeout); PROXY_LOCAL_LOOPSOURCE_EXT_APIS_; void OnPresleep() override; void OnFinishSleep() override; void DoParanoia(); AuAUInt32 uAtomicSemaphore {}; AuAUInt32 uAtomicKernelSemaphore {}; AuUInt32 uMaxCount {}; }; }