diff options
author | Rémi Verschelde <rverschelde@gmail.com> | 2024-08-28 15:46:57 +0200 |
---|---|---|
committer | Rémi Verschelde <rverschelde@gmail.com> | 2024-08-28 15:46:57 +0200 |
commit | e439154407721b2e053c38decaa77cb520d22a12 (patch) | |
tree | 6e4993a1f86815697007bc3f0f66ecd31182437a /core/object/worker_thread_pool.cpp | |
parent | 9f05ca9fc5e338b1bbc3a5dcbbc88a3f09d20e1a (diff) | |
parent | 5dade0e08b6647cf4b836402a797e9b8f46052b1 (diff) | |
download | redot-engine-e439154407721b2e053c38decaa77cb520d22a12.tar.gz |
Merge pull request #96225 from RandomShaper/wtp_fix_yield
WorkerThreadPool: Fix end-of-yield logic potentially leading to deadlocks
Diffstat (limited to 'core/object/worker_thread_pool.cpp')
-rw-r--r-- | core/object/worker_thread_pool.cpp | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/core/object/worker_thread_pool.cpp b/core/object/worker_thread_pool.cpp index 7fd43c4094..25ad3bf964 100644 --- a/core/object/worker_thread_pool.cpp +++ b/core/object/worker_thread_pool.cpp @@ -461,7 +461,10 @@ void WorkerThreadPool::_wait_collaboratively(ThreadData *p_caller_pool_thread, T p_caller_pool_thread->signaled = false; if (IS_WAIT_OVER) { - p_caller_pool_thread->yield_is_over = false; + if (unlikely(p_task == ThreadData::YIELDING)) { + p_caller_pool_thread->yield_is_over = false; + } + if (!exit_threads && was_signaled) { // This thread was awaken for some additional reason, but it's about to exit. // Let's find out what may be pending and forward the requests. |