/*** Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: AsyncApp.hpp Date: 2021-6-26 Author: Reece ***/ #pragma once #include "ThreadPool.hpp" namespace Aurora::Async { void InitApp(); void ReleaseApp(); inline struct AsyncApp *gAsyncApp; struct AsyncApp : IAsyncApp, ThreadPool { bool Spawn(WorkerId_t workerId) override; void SetRunningMode(bool eventRunning) override; bool Create(WorkerId_t workerId) override; bool InRunnerMode() override; bool Poll() override; bool RunOnce() override; bool Run() override; void Shutdown() override; bool Exiting() override; AuUInt32 PollAndCount(bool bStrict = true) override; AuUInt32 RunAllPending() override; AuSPtr NewWorkItem(const WorkerId_t &worker, const AuSPtr &task) override; AuSPtr NewWorkFunction(const WorkerId_t &worker, AuVoidFunc callback) override; AuSPtr NewFence() override; Threading::Threads::ThreadShared_t ResolveHandle(WorkerId_t) override; AuBST> GetThreads() override; WorkerId_t GetCurrentThread() override; bool Sync(WorkerId_t workerId, AuUInt32 timeoutMs = 0, bool requireSignal = false) override; AuSPtr WorkerToLoopSource(WorkerId_t id) override; void Signal(WorkerId_t workerId) override; void Wakeup(WorkerId_t workerId) override; void SyncAllSafe() override; void AddFeature(WorkerId_t id, AuSPtr feature, bool async) override; void AssertInThreadGroup(ThreadGroup_t group) override; void AssertWorker(WorkerId_t id) override; AuSPtr GetIOProcessor(WorkerId_t pid) override; AuSPtr GetIONetInterface(WorkerId_t pid) override; AuSPtr GetIONetWorker(WorkerId_t pid) override; AuSPtr ToKernelWorkQueue() override; AuSPtr ToKernelWorkQueue(WorkerId_t workerId) override; AuSPtr GetIOGroup(WorkerId_t id) override; // Main thread logic void Start() override; void Main() override; void SetConsoleCommandDispatcher(WorkerId_t id) override; AuSPtr GetShutdownEvent() override; void AddDependency(AuSPtr pPool) override; void IncrementAbortFenceOnPool() override; void IncrementAbortFenceOnWorker(WorkerId_t workerId) override; AuUInt64 QueryAbortFence(AuOptional optWorkerId) override; bool QueryShouldAbort(AuOptional optWorkerId, AuUInt64 uFenceMagic) override; void CleanUpWorker(WorkerId_t wid) override; void CleanWorkerPoolReservedZeroFree() override; AuOptional commandDispatcher_; }; }