/*** 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; AuSPtr GetTriggerLoopSource() override; void TryTrigger() override; bool HasCompleted() override; AuPair GetStats() override; void SetCallbacks(const AuSPtr &pCallbacks) override; void DoIOTick(); void ResetMemoryPins(); bool HasItemsActive(); void AddWorkItem(AuSPtr pCompletable) override; private: AuMutex mutex; AuCriticalSection cs; CompletionQuantumEventProvider anyProbablyAlwaysPresentEvent; CompletionQuantumEventProvider andPlsDontAllocateFdIfUntouchedEvent; AuList> workItems; AuSPtr pCallbacks; AuSPtr pAnyBarrier; AuSPtr pAndBarrier; AuUInt32 uAdded {}; AuUInt32 uTriggered {}; bool bNoAny {}; }; }