From 7d01eaa2dc951b353dfc7d29fb34d804847b8344 Mon Sep 17 00:00:00 2001 From: Valentin Churavy Date: Wed, 5 Jul 2023 12:11:13 +0200 Subject: [PATCH] Remove dynamic dispatch from _wait/wait2 (#50202) Co-authored-by: Gabriel Baraldi (cherry picked from commit e025877105630311b7f07d470d3cecda11a3e5d7) --- base/task.jl | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/base/task.jl b/base/task.jl index 4fbb51fde3e8e..f7a82b9c42ab9 100644 --- a/base/task.jl +++ b/base/task.jl @@ -303,13 +303,14 @@ end # just wait for a task to be done, no error propagation function _wait(t::Task) if !istaskdone(t) - lock(t.donenotify) + donenotify = t.donenotify::ThreadSynchronizer + lock(donenotify) try while !istaskdone(t) - wait(t.donenotify) + wait(donenotify) end finally - unlock(t.donenotify) + unlock(donenotify) end end nothing @@ -330,13 +331,14 @@ function _wait2(t::Task, waiter::Task) tid = Threads.threadid() ccall(:jl_set_task_tid, Cint, (Any, Cint), waiter, tid-1) end - lock(t.donenotify) + donenotify = t.donenotify::ThreadSynchronizer + lock(donenotify) if !istaskdone(t) - push!(t.donenotify.waitq, waiter) - unlock(t.donenotify) + push!(donenotify.waitq, waiter) + unlock(donenotify) return nothing else - unlock(t.donenotify) + unlock(donenotify) end end schedule(waiter)