coroutines on windows...

This commit is contained in:
Dynamitos
2021-11-19 15:08:56 +01:00
parent 56469a137a
commit 94be513538
11 changed files with 178 additions and 125 deletions
+41 -22
View File
@@ -47,25 +47,26 @@ ThreadPool::~ThreadPool()
void ThreadPool::addJob(Job&& job)
{
std::unique_lock lock(jobQueueLock);
std::cout << "Adding job " << job.id << std::endl;
jobQueue.add(std::move(job));
jobQueueCV.notify_one();
}
void ThreadPool::addJob(MainJob&& job)
{
std::unique_lock lock(mainJobLock);
//std::cout << "Adding main job " << std::addressof(job.handle) << std::endl;
std::cout << "Adding main job " << job.id << std::endl;
mainJobs.add(std::move(job));
mainJobCV.notify_one();
}
void ThreadPool::enqueueWaiting(Event* event, Job&& job)
{
//std::cout << job << " waiting for event " << event->name << std::endl;
std::cout << job.id << " waiting for event " << event->name << std::endl;
std::unique_lock lock(waitingLock);
waitingJobs[*event].add(std::move(job));
}
void ThreadPool::enqueueWaiting(Event* event, MainJob&& job)
{
//std::cout << std::addressof(job.handle) << " main waiting for event " << event->name << std::endl;
std::cout << job.id << " main waiting for event " << event->name << std::endl;
std::unique_lock lock(waitingMainLock);
waitingMainJobs[*event].add(std::move(job));
}
@@ -76,8 +77,9 @@ void ThreadPool::notify(Event* event)
std::unique_lock lock2(waitingLock);
while(!waitingJobs[*event].empty())
{
//std::cout << "Waking up job " << job << std::endl;
jobQueue.add(std::move(waitingJobs[*event].retrieve()));
std::cout << "Waking up job " << waitingJobs[*event].front().id << std::endl;
Job job = std::move(waitingJobs[*event].retrieve());
jobQueue.add(std::move(job));
jobQueueCV.notify_one();
}
}
@@ -86,37 +88,54 @@ void ThreadPool::notify(Event* event)
std::unique_lock lock2(waitingMainLock);
while(!waitingMainJobs[*event].empty())
{
std::cout << "Waking up main job " << waitingMainJobs[*event].front().id << std::endl;
mainJobs.add(std::move(waitingMainJobs[*event].retrieve()));
mainJobCV.notify_one();
}
}
}
void ThreadPool::tryMainJob()
{
MainJob job;
{
std::unique_lock lock(mainJobLock);
if(!mainJobs.empty())
{
job = std::move(mainJobs.retrieve());
}
else
{
return;
}
}
job.resume();
}
void ThreadPool::threadLoop(const bool mainThread)
{
while(running.load())
{
if(mainThread)
{
std::unique_lock lock(mainJobLock);
if(!mainJobs.empty())
tryMainJob();
}
Job job;
{
std::unique_lock lock(jobQueueLock);
if(jobQueue.empty())
{
MainJob&& job = mainJobs.retrieve();
lock.unlock();
job.resume();
jobQueueCV.wait(lock);
}
if(!jobQueue.empty())
{
job = std::move(jobQueue.retrieve());
}
else
{
continue;
}
}
std::unique_lock lock(jobQueueLock);
if(jobQueue.empty())
{
jobQueueCV.wait(lock);
}
if(!jobQueue.empty())
{
Job&& job = jobQueue.retrieve();
lock.unlock();
//std::cout << "Starting job " << job << std::endl;
job.resume();
}
std::cout << "Starting job " << job.id << std::endl;
job.resume();
}
}