/*** Copyright (C) 2024 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: AuIOAPCLessWaitable.hpp Date: 2024-2-25 Author: Reece ***/ #pragma once #include namespace Aurora::IO::Async { struct APCLessWaitable; struct APCLessEvent : Loop::LSEvent { AuWPtr wpParent; void OnFinishSleep() override; }; struct APCLessWaitable : CompletionGroup::ICompletionGroupWorkItem, AuEnableSharedFromThis { APCLessWaitable(); AuSPtr GetLoopSource(); void SignalComplete(); void CheckLocal(); bool TryAttachToCompletionGroup(const AuSPtr &pCompletionGroup); AuSPtr GetCompletionGroup(); void Reset(); virtual void OnOriginThreadComplete() = 0; virtual bool HasCompletedForGCWI() override; virtual void CleanupForGCWI() override; virtual bool HasNonTrivialCleanup() override; bool HasBeenSignaled(); private: AuUInt threadId {}; AuSPtr pCompletionGroup; AuMutex mutex; AuSPtr pEvent; bool bHasCalledBack {}; volatile bool bHasFinished {}; }; }