/*** Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: WorkItem.hpp Date: 2021-6-26 Author: Reece ***/ #pragma once #include "ThreadPool.hpp" #include "IAsyncRunnable.hpp" namespace Aurora::Async { struct ThreadState; struct WorkItem : IWorkItem, IAsyncRunnable, AuEnableSharedFromThis { WorkItem(IThreadPoolInternal *owner, const WorkerPId_t &worker, const AuSPtr &task); ~WorkItem(); AuSPtr WaitFor(const AuSPtr &workItem) override; AuSPtr WaitFor(const AuList> &workItem) override; AuSPtr SetSchedTime(AuUInt32 ms) override; AuSPtr SetSchedTimeNs(AuUInt64 ns) override; AuSPtr AddDelayTime(AuUInt32 ms) override; AuSPtr AddDelayTimeNs(AuUInt64 ns) override; AuSPtr AddDelayTimeRepeating(AuUInt32 ms) override; AuSPtr AddDelayTimeNsRepeating(AuUInt64 ns) override; AuSPtr SetSchedTimeAbs(AuUInt32 ms) override; AuSPtr SetSchedTimeNsAbs(AuUInt64 ns) override; AuSPtr SetSchedSteadyTimeNsAbs(AuUInt64 ns) override; AuSPtr SetSchedByLoopSourceOnce(const AuSPtr &pLoopSource) override; AuSPtr SetSchedByLoopSourceRepeating(const AuSPtr &pLoopSource) override; AuSPtr Then(const AuSPtr &next) override; AuSPtr Dispatch() override; bool BlockUntilComplete() override; bool HasFinished() override; bool HasFinishedRepeatable(); bool HasFailed() override; void Cancel() override; void RunAsync() override; void CancelAsync() override; void *GetPrivateData() override; EWorkPriority GetPrio() override; void SetPrio(EWorkPriority prio) override; AuOptional> QueryFences() override; protected: bool CheckAlive(); virtual void DispatchTask(IWorkItemHandler::ProcessInfo &info); virtual void Cleanup(); private: void RunAsyncLocked(); void RunAsyncLocked2(); void RunAsyncLocked2(const IWorkItemHandler::ProcessInfo &info); bool WaitForLocked(const AuList> &workItem); void DispatchEx(bool check, bool bIsIOTick = false); void DispatchExLocked(bool check, bool bIsIOTick = false); IThreadPoolInternal *owner_ {}; AuSPtr GetState(); AuSPtr task_; AuOptionalEx worker_; EWorkPriority prio_ = EWorkPriority::ePriorityNormal; AuList> waitOn_; AuList> waiters_; AuCriticalSection lock; AuCriticalSection lock2; AuEvent finishedEvent_; AuUInt32 uShutdownCookie {}; AuOptionalEx optOtherCookie {}; AuSPtr pIOWatch; AuSPtr pIOWatchLS; bool finished {}; bool finished2 {}; bool failed {}; bool bIoRepeating {}; bool bRepeatingTimer {}; bool dispatchPending_ {}; AuUInt32 ioTickCount {}; AuUInt64 dispatchTimeNs_ {}; AuUInt64 delayTimeNs_ {}; void Fail(); bool Schedule(); void SendOff(); }; }