From 123ba9d464584b6681dcc1958552025878349e1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20J=2E=20Est=C3=A9banez?= Date: Fri, 12 May 2023 12:51:47 +0200 Subject: [PATCH] WorkerThreadPool: Handle exit signal in the tentative scheduling done during waits --- core/object/worker_thread_pool.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/core/object/worker_thread_pool.cpp b/core/object/worker_thread_pool.cpp index 3dca6b73a61..c188872bafe 100644 --- a/core/object/worker_thread_pool.cpp +++ b/core/object/worker_thread_pool.cpp @@ -258,15 +258,20 @@ void WorkerThreadPool::wait_for_task_completion(TaskID p_task_id) { if (index) { // We are an actual process thread, we must not be blocked so continue processing stuff if available. + bool must_exit = false; while (true) { if (task->done_semaphore.try_wait()) { // If done, exit break; } - if (task_available_semaphore.try_wait()) { - // Solve tasks while they are around. - _process_task_queue(); - continue; + if (!must_exit && task_available_semaphore.try_wait()) { + if (exit_threads) { + must_exit = true; + } else { + // Solve tasks while they are around. + _process_task_queue(); + continue; + } } OS::get_singleton()->delay_usec(1); // Microsleep, this could be converted to waiting for multiple objects in supported platforms for a bit more performance. }