/*** Copyright (C) 2023 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: AuThreadState.hpp Date: 2023-11-04 Author: Reece ***/ #pragma once #include "AuThreadStateSingletons.hpp" namespace Aurora::Async { struct AsyncLoop; struct GroupState; struct ThreadState; struct ThreadStateShutdown { bool bBreakMainLoop {}; bool bDropSubmissions {}; bool bIsKillerThread {}; AuUInt32 uShutdownFence { 1 }; }; struct ThreadStateSync { ThreadStateSync(); AuConditionMutex cvWorkMutex; AuConditionVariable cvVariable; AuAUInt32 cvLSActive {}; AuAUInt32 cvHasWork {}; AuSPtr eventLs; void SetEvent(bool bBoth = true, bool bHasWork = false); bool Init(); void UpdateCVState(ThreadState *pState); }; struct ThreadStateMeta { bool bOwnsThread {}; AuThreads::ThreadShared_t pThread; WorkerId_t id; }; struct ThreadStateStack { // Do not optimize away recursive self variables! // Always evaluate! // No multithread memory model awareness is required; we just need volatile. volatile AuUInt32 uStackCookie {}; volatile AuUInt32 uStackMaxRecursiveAsyncPromiseCalls { 4 }; volatile AuUInt32 uStackCallDepth {}; volatile AuUInt32 uStackMaxCookie { 5 }; volatile AuUInt8 uWorkMultipopCount { 32 }; }; struct ThreadStateFeatureCallbacks { AuMutex mutex; AuList> features; }; struct ThreadStateBase { ThreadStateBase(); ~ThreadStateBase(); AuWPtr parent; ///////////////////////////////// ThreadStateShutdown shutdown; ThreadStateMeta thread; ThreadStateSync sync; AuSPtr asyncLoop; ThreadStateStack stackState; ThreadStateFeatureCallbacks tlsFeatures; ThreadStateSingletons singletons; bool Init(); void Deinit(); }; }