From: "ioquatix (Samuel Williams)" Date: 2022-03-29T22:04:53+00:00 Subject: [ruby-core:108113] [Ruby master Bug#18663] Autoload doesn't work with fiber context switch. Issue #18663 has been updated by ioquatix (Samuel Williams). I've tracked down the root of this bug, being that it's not yielding to the fiber scheduler and implements it's own condition variable like semantics. I'll propose a fix. ---------------------------------------- Bug #18663: Autoload doesn't work with fiber context switch. https://bugs.ruby-lang.org/issues/18663#change-97078 * Author: ioquatix (Samuel Williams) * Status: Open * Priority: Normal * Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN ---------------------------------------- As discussed most recently here: https://github.com/ruby/debug/issues/580 The following program appears to work: ```ruby #!/usr/bin/env ruby require 'tempfile' Tempfile.create(['foo', '.rb']) do |file| file.write(<<~RUBY) # $stderr.puts 1; q = Queue.new $stderr.puts 2; t = Thread.new{q.pop} $stderr.puts 3; q << :sig $stderr.puts 4; t.join sleep 1 class C end RUBY file.close autoload :C, file.path Thread.new do threads = 3.times.map do |i| Thread.new do $stderr.puts "LOADING C" $stderr.puts C end end threads.each(&:join) end.join end ``` This one doesn't: ```ruby #!/usr/bin/env ruby require 'tempfile' require_relative 'lib/async' Tempfile.create(['foo', '.rb']) do |file| file.write(<<~RUBY) # $stderr.puts 1; q = Queue.new $stderr.puts 2; t = Thread.new{q.pop} $stderr.puts 3; q << :sig $stderr.puts 4; t.join class C end RUBY file.close autoload :C, file.path Async do |task| 3.times do |i| task.async do $stderr.puts "LOADING C" $stderr.puts C end end end.wait end ``` Semantically, they should be very similar. It feels like someone is checking the current thread rather than the current fiber or there is a poor implementation of locking somewhere, however I don't actually know for sure yet, investigation is required. -- https://bugs.ruby-lang.org/ Unsubscribe: