From 9db333fa80caf9bca9712a4301efdbf136f00cf5 Mon Sep 17 00:00:00 2001 From: SirLynix Date: Wed, 31 Jan 2024 21:04:42 +0100 Subject: [PATCH] Core/TaskScheduler: Remove jthread and stop_token jthread/stop_token are not yet implemented in libc++ and on Apple Clang --- include/Nazara/Core/TaskScheduler.hpp | 4 ++-- src/Nazara/Core/TaskScheduler.cpp | 26 ++++++++++++++++++-------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/include/Nazara/Core/TaskScheduler.hpp b/include/Nazara/Core/TaskScheduler.hpp index a077eac30..ecf1d7b62 100644 --- a/include/Nazara/Core/TaskScheduler.hpp +++ b/include/Nazara/Core/TaskScheduler.hpp @@ -23,7 +23,7 @@ namespace Nz TaskScheduler(unsigned int workerCount = 0); TaskScheduler(const TaskScheduler&) = delete; - TaskScheduler(TaskScheduler&&) = default; + TaskScheduler(TaskScheduler&&) = delete; ~TaskScheduler(); void AddTask(Task&& task); @@ -33,7 +33,7 @@ namespace Nz void WaitForTasks(); TaskScheduler& operator=(const TaskScheduler&) = delete; - TaskScheduler& operator=(TaskScheduler&&) = default; + TaskScheduler& operator=(TaskScheduler&&) = delete; private: class Worker; diff --git a/src/Nazara/Core/TaskScheduler.cpp b/src/Nazara/Core/TaskScheduler.cpp index c9e76552d..301c42fc3 100644 --- a/src/Nazara/Core/TaskScheduler.cpp +++ b/src/Nazara/Core/TaskScheduler.cpp @@ -8,8 +8,8 @@ #include #include #include +#include #include -#include #include #include @@ -22,13 +22,14 @@ namespace Nz { public: Worker(TaskScheduler& owner, unsigned int workerIndex) : + m_running(true), m_owner(owner), m_workerIndex(workerIndex) { - m_thread = std::jthread([this](std::stop_token stopToken) + m_thread = std::thread([this] { SetCurrentThreadName(fmt::format("NzWorker #{0}", m_workerIndex).c_str()); - Run(stopToken); + Run(); }); } @@ -40,6 +41,14 @@ namespace Nz NAZARA_UNREACHABLE(); } + ~Worker() + { + m_running = false; + m_conditionVariable.notify_one(); + + m_thread.join(); + } + bool AddTask(Task&& task) { std::unique_lock lock(m_mutex, std::defer_lock); @@ -53,7 +62,7 @@ namespace Nz return true; } - void Run(std::stop_token& stopToken) + void Run() { StackArray randomWorkerIndices = NazaraStackArrayNoInit(unsigned int, m_owner.GetWorkerCount() - 1); { @@ -82,10 +91,10 @@ namespace Nz idle = true; } - m_conditionVariable.wait(m_mutex, stopToken, [this] { return !m_tasks.empty(); }); + m_conditionVariable.wait(lock, [this] { return !m_running || !m_tasks.empty(); }); } - if (stopToken.stop_requested()) + if (!m_running) break; auto ExecuteTask = [&](TaskScheduler::Task& task) @@ -150,9 +159,10 @@ namespace Nz } private: - std::condition_variable_any m_conditionVariable; + std::atomic_bool m_running; + std::condition_variable m_conditionVariable; std::mutex m_mutex; - std::jthread m_thread; + std::thread m_thread; std::vector m_tasks; TaskScheduler& m_owner; unsigned int m_workerIndex;