Actions
Bug #20346
closedFiberScheduler.unblock not called by Thread#join when Thread body contains Ractor.take
Bug #20346:
FiberScheduler.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
