/*** 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; float GetPrio() override; void SetPrio(float val) 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_; float prio_ = 0.5f; AuList> waitOn_; AuList> waiters_; AuThreadPrimitives::SpinLock lock; AuThreadPrimitives::SpinLock lock2; AuThreadPrimitives::EventUnique_t finishedEvent_; bool finished {}; bool failed {}; bool dispatchPending_ {}; AuUInt64 dispatchTimeNs_ {}; AuUInt64 delayTimeNs_ {}; IThreadPoolInternal *owner_ {}; void Fail(); bool Schedule(); void SendOff(); }; }