AuroraRuntime/Source/Async/WorkItem.hpp

51 lines
1.4 KiB
C++
Raw Normal View History

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