65 lines
1.5 KiB
C++
65 lines
1.5 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 &worker : this->workers)
|
|
{
|
|
AuAtomicAdd(&worker.second->cvHasWork, 1u);
|
|
worker.second->cvVariable->Broadcast();
|
|
worker.second->eventLs->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)));
|
|
}
|
|
} |