/*** Copyright (C) 2023 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: AuAsyncKeepGroupAlive.cpp Date: 2023-11-04 Author: Reece ***/ #include #include "AuAsyncKeepGroupAlive.hpp" #include "ThreadPool.hpp" #include "Async.hpp" namespace Aurora::Async { struct KeepGroupAlive { KeepGroupAlive(AuSPtr pPool) : pPool(AuStaticCast(pPool)) { AuAtomicAdd(&this->pPool->uAtomicCounter, 1u); } ~KeepGroupAlive() { auto uNow = AuAtomicSub(&this->pPool->uAtomicCounter, 1u); if (uNow == 0) { for (const auto &pState : this->pPool->threadGroups_) { if (pState) { pState->SignalAll(); } } } } AuSPtr pPool; }; AUKN_SYM AuSPtr KeepThreadPoolAlive(AuSPtr pPool) { return AuMakeSharedThrow(pPool); } }