/*** Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: WorkItem.hpp Date: 2021-6-26 Author: Reece ***/ #pragma once namespace Aurora::Async { class WorkItem : public IWorkItem, public IAsyncRunnable, public std::enable_shared_from_this { public: WorkItem(const DispatchTarget_t &worker_, const AuSPtr &task_, bool supportsBlocking); ~WorkItem(); void WaitFor(const AuSPtr &workItem) override; void WaitFor(const AuList> &workItem) override; void SetSchedTime(AuUInt32 ms) override; void SetSchedTimeNs(AuUInt64 ns) override; void Dispatch() override; bool BlockUntilComplete() override; bool HasFinished() override; bool HasFailed() override; void RunAsync() override; void CancelAsync() override; private: void DispatchEx(bool check); AuSPtr task_; DispatchTarget_t worker_; AuList> waitOn_; AuList> waiters_; Threading::Primitives::SpinLock lock; Threading::Primitives::EventUnique_t finishedEvent_; bool finished {}; bool failed {}; bool dispatchPending_ {}; AuUInt64 dispatchTimeNs_ {}; void Fail(); void Schedule(); void SendOff(); }; }