/*** 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" namespace Aurora::Async { struct WorkItem : IWorkItem, IAsyncRunnable, AuEnableSharedFromThis { WorkItem(IThreadPoolInternal *owner, const WorkerPId_t &worker, const AuSPtr &task, bool bSupportsBlocking); ~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 SetSchedTimeAbs(AuUInt32 ms) override; AuSPtr SetSchedTimeNsAbs(AuUInt64 ns) override; AuSPtr Then(const AuSPtr &next) override; AuSPtr Dispatch() override; bool BlockUntilComplete() override; bool HasFinished() override; bool HasFailed() override; void Cancel() override; void RunAsync() override; void CancelAsync() override; void *GetPrivateData() override; AuOptional ToWorkResultT() override; EWorkPrio GetPrio() override; void SetPrio(EWorkPrio prio) override; private: void RunAsyncLocked(); void RunAsyncLocked2(); void RunAsyncLocked2(const IWorkItemHandler::ProcessInfo &info); bool WaitForLocked(const AuList> &workItem); void DispatchEx(bool check); void DispatchExLocked(bool check); AuSPtr task_; WorkerPId_t worker_; EWorkPrio prio_ = EWorkPrio::eNormalPrio; AuList> waitOn_; AuList> waiters_; AuThreadPrimitives::CriticalSection lock; AuThreadPrimitives::CriticalSection lock2; AuThreadPrimitives::Event finishedEvent_; bool finished {}; bool failed {}; bool dispatchPending_ {}; AuUInt64 dispatchTimeNs_ {}; AuUInt64 delayTimeNs_ {}; IThreadPoolInternal *owner_ {}; void Fail(); bool Schedule(); void SendOff(); }; }