/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: IOProcessor.hpp Date: 2022-6-6 Author: Reece ***/ #pragma once #include "AuIOPipeProcessor.hpp" #include "AuIOProcessorItems.hpp" #include "AuIOProcessorTimers.hpp" namespace Aurora::IO { struct IOProcessor : IIOProcessor, AuEnableSharedFromThis, AuAsync::IWorkItemHandler { ~IOProcessor(); IOProcessor(AuUInt threadId, bool tickOnly, AuAsync::WorkerPId_t worker, const AuSPtr &loop, bool bIsNoQueue); bool Init(); bool QueueIOEvent(const AuSPtr &ioEvent); void FrameRunIOWorkUnits(); AuUInt32 TryTick() override; AuUInt32 RunTick() override; AuUInt32 RunTickEx(AuUInt32 dwTimeout) override; AuUInt32 TickFor(const AuSPtr &ioEvent) override; bool TickForRegister(const AuSPtr &ioEvent); void TickForHack(const AuSPtr &ioEvent); bool bScheduled_ {}; AuUInt32 ManualTick() override; void DispatchFrame(ProcessInfo &info) override; bool SubmitIOWorkItem(const AuSPtr &work) override; bool AddEventListener(const AuSPtr &eventListener) override; void RemoveEventListener(const AuSPtr &eventListener) override; void FrameStart(); void FramePumpWaitingBlocked(); bool FrameWaitForAny(AuUInt32 msMax); AuUInt FrameRunEpilogue(); void FrameRunThreadIO(); void FrameRunCheckLSes(); void FrameRunAlerted(); void FrameRunAlertedSniffers(); void FrameEndOfFrameEvents(); AuUInt FrameFinalize(); bool InternalIsTickReady(); void ClearProcessor(const AuSPtr &processor, bool fatal); void ReportState(EIOProcessorEventStage stage); AuUInt64 SetRefreshRate(AuUInt64 ns) override; bool HasRefreshRate() override; AuUInt64 GetOwnedThreadId() override; bool MultiplexRefreshRateWithIOEvents() override; AuSPtr StartIOWatch(const AuSPtr &object, const AuSPtr &listener) override; AuSPtr StartSimpleIOWatch(const AuSPtr &object, const AuSPtr &listener) override; AuSPtr StartSimpleLSWatch(const AuSPtr &source, const AuSPtr &listener) override; AuSPtr StartIOWatchEx (const AuSPtr &object, const AuSPtr &listener, bool singleshot) override; AuSPtr StartSimpleIOWatchEx(const AuSPtr& object, const AuSPtr& listener, bool singleshot) override; AuSPtr StartSimpleLSWatchEx(const AuSPtr& source, const AuSPtr& listener, bool singleshot, AuUInt32 msTimeout) override; AuSPtr ToPipeProcessor() override; AuSPtr ToQueue() override; void ReleaseAllWatches() override; bool HasItems() override; void WakeupThread(); bool CheckThread(); bool RequestRemovalForItemFromAnyThread(const AuSPtr &processor); AuSPtr pLoopQueue; AuUInt threadId; AuUInt64 refreshRateNs {}; AuUInt64 minFrameDeltaNs {}; bool bIsNoQueue; void UpdateTimers(); void AddTimer(); void AddTimerLS(); void StartAsyncTimerIfAny(); void RemoveTimer(); void CancelWorkItem(); void RemoveLSTimer(); bool IsTickOnly(); bool IsAsync(); bool mutliplexIOAndTimer {true}; IOProcessorItems items; IOProcessorTimers timers; AuAsync::WorkerPId_t asyncWorker; AuSPtr pWorkItem; AuThreadPrimitives::MutexUnique_t mutex; AuThreadPrimitives::SpinLock listenersSpinLock; AuList> listeners; AuList> workUnits; IOPipeProcessor streamProcessors; bool bFrameStart {}; }; }