88 lines
1.7 KiB
C++
88 lines
1.7 KiB
C++
/*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "Task.hpp"
|
|
#include "Base/Logger.hpp"
|
|
#include "Base/Wrapper.hpp"
|
|
#include <concurrentqueue.h>
|
|
|
|
namespace OpenVulkano
|
|
{
|
|
class ITaskPool
|
|
{
|
|
protected:
|
|
void ExecuteTask(const Ptr<Task>& task)
|
|
{
|
|
try
|
|
{
|
|
task->Execute();
|
|
}
|
|
catch(const std::exception& e)
|
|
{
|
|
Logger::MANAGER->error("Failed to execute task! With exception: {}", e.what());
|
|
}
|
|
catch(...)
|
|
{
|
|
Logger::MANAGER->error("Failed to execute task! With unknown throwable");
|
|
}
|
|
}
|
|
|
|
public:
|
|
/*template<class T, typename... Args>
|
|
void EmplaceTask(Args&&... args)
|
|
{
|
|
m_tasks.enqueue(std::make_shared<T>((std::forward<Args>(args)...)));
|
|
}*/
|
|
|
|
virtual void Enqueue(const Ptr<Task>& task) = 0;
|
|
|
|
void Enqueue(const std::function<void()>& taskFunction)
|
|
{
|
|
Enqueue(std::make_shared<FunctionalTask>(taskFunction));
|
|
}
|
|
|
|
void operator +=(const std::function<void()>& taskFunction)
|
|
{
|
|
Enqueue(taskFunction);
|
|
}
|
|
};
|
|
|
|
class MainThreadTaskPool final : public ITaskPool
|
|
{
|
|
static MainThreadTaskPool* INSTANCE;
|
|
moodycamel::ConcurrentQueue<Ptr<Task>> m_tasks;
|
|
|
|
public:
|
|
MainThreadTaskPool()
|
|
{
|
|
if (!INSTANCE) INSTANCE = this;
|
|
}
|
|
|
|
~MainThreadTaskPool()
|
|
{
|
|
if (INSTANCE == this) INSTANCE = nullptr;
|
|
}
|
|
|
|
static MainThreadTaskPool& GetInstance() { return *INSTANCE; }
|
|
|
|
void Tick()
|
|
{
|
|
Ptr<Task> task;
|
|
while (m_tasks.try_dequeue(task))
|
|
{
|
|
ExecuteTask(task);
|
|
}
|
|
}
|
|
|
|
void Enqueue(const Ptr<Task>& task) override
|
|
{
|
|
m_tasks.enqueue(task);
|
|
}
|
|
};
|
|
}
|