/*** 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 OnSingleCompletionIntl(); void TryCreateInternal(); void TryCollectInternal(); bool WaitForAnyMS(AuUInt32 uTimeoutOrZeroMS) override; bool WaitForAllMS(AuUInt32 uTimeoutOrZeroMS) override; AuSPtr GetTriggerLoopSource() override; void TryTrigger() override; void TryTriggerLater() override; bool HasCompleted() override; AuPair GetStats() override; void SetCallbacks(const AuSPtr &pCallbacks) override; void DoIOTick(bool bManual); void ResetMemoryPins(); bool HasItemsActive(); void AddWorkItem(const AuSPtr &pCompletable) override; void UnsafeRemoveItem(const AuSPtr &pCompletable); void AddCallbackTick(const AuSPtr &pCallbackInvoker, bool bAny); bool IsNeverEnding() override; void SetNeverEnding(bool bValue) override; void ResetAnd(); void MakeInternalAsync(AuWorkerID pid); private: AuMutex mutex; AuCriticalSection cs; CompletionQuantumEventProvider anyProbablyAlwaysPresentEvent; CompletionQuantumEventProvider andPlsDontAllocateFdIfUntouchedEvent; AuList> workItems; AuSPtr pCallbacks; AuSPtr pAnyBarrier; AuSPtr pAndBarrier; AuSPtr pAnyBarrierInternal; AuWorkerID workerId; AuList, bool>> callbackTicks; AuUInt32 uAdded {}; AuUInt32 uTriggered {}; bool bNoAny {}; bool bIsNeverEnding {}; bool bTerminated {}; }; }