/*** Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: AsyncApp.hpp Date: 2021-6-26 Author: Reece ***/ #pragma once namespace Aurora::Async { struct GroupState; struct ThreadState; //class WorkItem; void DecRunningTasks(); void IncRunningTasks(); class AsyncApp : public IAsyncApp { public: AsyncApp(); // Main thread logic void Start() override; void Main() override; void Shutdown() override; bool Exiting() override; // Spawning bool Spawn(WorkerId_t) override; Threading::Threads::ThreadShared_t ResolveHandle(WorkerId_t) override; AuBST> GetThreads() override; WorkerId_t GetCurrentThread() override; // Synchronization bool Sync(ThreadGroup_t group, bool requireSignal, AuUInt32 timeout) override; void Signal(ThreadGroup_t group) override; bool WaitFor(WorkerId_t unlocker, Threading::IWaitable *primitive, int ms) override; // when unlocker = this, pump event loop bool SyncTimeout(ThreadGroup_t group, AuUInt32 ms) override; void SyncAllSafe() override; // Features void AddFeature(WorkerId_t id, AuSPtr feature, bool async = false) override; // Debug void AssertInThreadGroup(ThreadGroup_t group) override; void AssertWorker(WorkerId_t id) override; void Run(DispatchTarget_t target, AuSPtr runnable); void ShutdownOutOfTasks(); private: // TODO: BarrierMultiple bool Barrier(WorkerId_t, AuUInt32 ms, bool requireSignal, bool drop); bool Poll(bool a); Threading::Primitives::RWLockUnique_t rwlock_; AuSPtr GetGroup(ThreadGroup_t type); AuSPtr GetThreadState(); void Entrypoint(WorkerId_t id); using ThreadDb_t = AuBST>; ThreadDb_t threads_; bool shuttingdown_ {}; }; }