/*** Copyright (C) 2023 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: CompletionGroup.hpp Date: 2023-12-28 Author: Reece ***/ #pragma once #include "CompletionQuantumEventProvider.hpp" namespace Aurora::IO::CompletionGroup { struct CompletionGroup : AuEnableSharedFromThis, ICompletionGroup { CompletionGroup(); ~CompletionGroup(); AuSPtr ToAndLoopSource() override; AuSPtr ToAnyLoopSource() override; AuSPtr OnCompletion() override; AuSPtr OnSingleCompletion() override; bool WaitForAnyMS(AuUInt32 uTimeoutOrZeroMS) override; bool WaitForAllMS(AuUInt32 uTimeoutOrZeroMS) override; AuSPtr GetTriggerLoopSource() override; void TryTrigger() override; bool HasCompleted() override; AuPair GetStats() override; void SetCallbacks(const AuSPtr &pCallbacks) override; void DoIOTick(bool bManual); void ResetMemoryPins(); bool HasItemsActive(); void AddWorkItem(AuSPtr pCompletable) override; void AddCallbackTick(const AuSPtr &pCallbackInvoker, bool bAny); bool IsNeverEnding() override; void SetNeverEnding(bool bValue) override; private: AuMutex mutex; AuCriticalSection cs; CompletionQuantumEventProvider anyProbablyAlwaysPresentEvent; CompletionQuantumEventProvider andPlsDontAllocateFdIfUntouchedEvent; AuList> workItems; AuSPtr pCallbacks; AuSPtr pAnyBarrier; AuSPtr pAndBarrier; AuList, bool>> callbackTicks; AuUInt32 uAdded {}; AuUInt32 uTriggered {}; bool bNoAny {}; bool bIsNeverEnding {}; bool bTerminated {}; }; }