/*** Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: AuGroupState.cpp Date: 2021-11-1 Author: Reece ***/ #include #include "Async.hpp" #include "AuGroupState.hpp" #include namespace Aurora::Async { bool GroupState::Init() { return true; } AuSPtr GroupState::GetThreadByIndex(ThreadId_t uIndex) { { AU_LOCK_GUARD(this->deinitMutex); if (AuArraySize(this->wpWorkers) > uIndex) { if (auto pState = AuTryLockMemoryType(this->wpWorkers[uIndex])) { return pState; } } } AU_LOCK_GUARD(this->workersMutex); auto itr = this->workers.find(uIndex); if (itr == this->workers.end()) { return {}; } return itr->second; } void GroupState::Decommit(ThreadId_t id) { { AU_LOCK_GUARD(this->deinitMutex); if (AuArraySize(this->wpWorkers) > id) { this->wpWorkers[id] = {}; } } AU_LOCK_GUARD(this->workersMutex); for (auto itr = this->workers.begin(); itr != this->workers.end(); ) { auto &[id2, pWorker] = *itr; if (id == id2) { itr = this->workers.erase(itr); } else { itr++; } } } void GroupState::SignalAll(bool bHasWork) { AU_LOCK_GUARD(this->workersMutex); for (const auto &[id, pWorker] : this->workers) { if (!pWorker) { continue; } pWorker->sync.SetEvent(true, bHasWork); } } bool GroupState::AddWorker(ThreadId_t id, AuSPtr pState) { AU_LOCK_GUARD(this->workersMutex); if (AuArraySize(this->wpWorkers) > id) { this->wpWorkers[id] = pState; } if (!AuTryInsert(this->workers, AuMakePair(id, pState))) { this->wpWorkers[id] = {}; return {}; } return true; } AuSPtr GroupState::CreateWorker(WorkerId_t workerId, bool bCreate) { if (auto pThreadState = AuMakeShared()) { pThreadState->thread.bOwnsThread = !bCreate; pThreadState->thread.id = workerId; pThreadState->parent = this->SharedFromThis(); if (!pThreadState->Init()) { SysPushErrorNested(); return {}; } if (!this->AddWorker(workerId.second, pThreadState)) { SysPushErrorNested(); return {}; } return pThreadState; } else { SysPushErrorMemory(); return {}; } } }