Skip to content

Commit b345e87

Browse files
committed
Use a scheduler task for thread sleep
1 parent b0323ab commit b345e87

File tree

1 file changed

+19
-1
lines changed

1 file changed

+19
-1
lines changed

base/task.jl

+19-1
Original file line numberDiff line numberDiff line change
@@ -1145,6 +1145,16 @@ function throwto(t::Task, @nospecialize exc)
11451145
return try_yieldto(identity)
11461146
end
11471147

1148+
@inline function wait_forever()
1149+
while true
1150+
wait()
1151+
end
1152+
end
1153+
1154+
const sched_task = OncePerThread{Task}() do
1155+
@task wait_forever()
1156+
end
1157+
11481158
function ensure_rescheduled(othertask::Task)
11491159
ct = current_task()
11501160
W = workqueue_for(Threads.threadid())
@@ -1184,7 +1194,15 @@ checktaskempty = Partr.multiq_check_empty
11841194
@noinline function poptask(W::StickyWorkqueue)
11851195
task = trypoptask(W)
11861196
if !(task isa Task)
1187-
task = ccall(:jl_task_get_next, Ref{Task}, (Any, Any, Any), trypoptask, W, checktaskempty)
1197+
process_events()
1198+
task = trypoptask(W)
1199+
end
1200+
if !(task isa Task)
1201+
if current_task() === sched_task()
1202+
task = ccall(:jl_task_get_next, Ref{Task}, (Any, Any, Any), trypoptask, W, checktaskempty)
1203+
else
1204+
yieldto(sched_task)
1205+
end
11881206
end
11891207
set_next_task(task)
11901208
nothing

0 commit comments

Comments
 (0)