AuroraRuntime/Source/Async/GroupState.cpp

75 lines
1.6 KiB
C++

/***
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
File: GroupState.cpp
Date: 2021-11-1
Author: Reece
***/
#include <Source/RuntimeInternal.hpp>
#include "Async.hpp"
#include "GroupState.hpp"
#include <Source/IO/Loop/LSAsync.hpp>
namespace Aurora::Async
{
bool GroupState::Init()
{
return true;
}
AuSPtr<ThreadState> GroupState::GetThreadByIndex(ThreadId_t uIndex)
{
// TODO: deinit mutex
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::BroadCast()
{
AU_LOCK_GUARD(this->workersMutex);
for (const auto &[id, pWorker] : this->workers)
{
if (!pWorker)
{
continue;
}
AuAtomicAdd(&pWorker->cvHasWork, 1u);
pWorker->cvVariable->Broadcast();
if (auto pEventLS = pWorker->eventLs)
{
pEventLS->Set();
}
}
}
void GroupState::AddWorker(ThreadId_t id, AuSPtr<ThreadState> pState)
{
AU_LOCK_GUARD(this->workersMutex);
if (AuArraySize(this->wpWorkers) > id)
{
this->wpWorkers[id] = pState;
}
SysAssert(AuTryInsert(this->workers, AuMakePair(id, pState)));
}
}