Project

General

Profile

Actions

Bug #20346

open

FiberScheduler.unblock not called by Thread#join when Thread body contains Ractor.take

Added by forthoney (Seong-Heon Jung) 8 months ago. Updated 5 months ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:117216]

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

Also available in: Atom PDF

Like1
Like0