Browse Source

Merge pull request #76999 from RandomShaper/fix_wtp_exit

`WorkerThreadPool`: Handle exit signal in the tentative scheduling done during waits
Rémi Verschelde 2 years ago
parent
commit
8dd48a98e2
1 changed files with 9 additions and 4 deletions
  1. 9 4
      core/object/worker_thread_pool.cpp

+ 9 - 4
core/object/worker_thread_pool.cpp

@@ -258,15 +258,20 @@ void WorkerThreadPool::wait_for_task_completion(TaskID p_task_id) {
 
 
 		if (index) {
 		if (index) {
 			// We are an actual process thread, we must not be blocked so continue processing stuff if available.
 			// We are an actual process thread, we must not be blocked so continue processing stuff if available.
+			bool must_exit = false;
 			while (true) {
 			while (true) {
 				if (task->done_semaphore.try_wait()) {
 				if (task->done_semaphore.try_wait()) {
 					// If done, exit
 					// If done, exit
 					break;
 					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.
 				OS::get_singleton()->delay_usec(1); // Microsleep, this could be converted to waiting for multiple objects in supported platforms for a bit more performance.
 			}
 			}