/*** 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 { class WorkItem : public IWorkItem, public IAsyncRunnable, public AuEnableSharedFromThis { public: WorkItem(IThreadPoolInternal *owner, const WorkerId_t &worker_, const AuSPtr &task_, bool supportsBlocking); ~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(); bool WaitForLocked(const AuList> &workItem); void DispatchEx(bool check); void DispatchExLocked(bool check); AuSPtr task_; WorkerId_t worker_; float prio_ = 0.5f; AuList> waitOn_; AuList> waiters_; AuThreadPrimitives::SpinLock lock; AuThreadPrimitives::EventUnique_t finishedEvent_; bool finished {}; bool failed {}; bool dispatchPending_ {}; AuUInt64 dispatchTimeNs_ {}; AuUInt64 delayTimeNs_ {}; IThreadPoolInternal *owner_ {}; void Fail(); bool Schedule(); void SendOff(); }; }