Actions
Bug #20346
openFiberScheduler.unblock not called by Thread#join when Thread body contains Ractor.take
Description
When using a Ractor.take
inside a different thread, Thread#join
on the thread running Ractor.take
fails to call FiberScheduler.unblock
. The below code can replicate this behavior
require "async"
class RactorWrapper
def initialize
@ractor = Ractor.new do
Ractor.recv # Ractor doesn't start until explicitly told to
# Do some calculations
fib = ->(x) { x < 2 ? 1 : fib.call(x - 1) + fib.call(x - 2) }
fib.call(20)
end
end
def take_async
@ractor.send(nil)
Thread.new { @ractor.take }.join.value
end
end
Async do |task|
10000.times do |i|
task.async do
RactorWrapper.new.take_async
puts i
end
end
end
The above code deadlocks, and when we leave a debugging print statement inside of Async
's scheduler's block
and unblock
method, we can confirm that we only call Scheduler.block
, and never Scheduler.unblock
Actions
Like1
Like0