From: "ioquatix (Samuel Williams)" Date: 2022-03-25T21:12:25+00:00 Subject: [ruby-core:108080] [Ruby master Bug#18663] Autoload doesn't work with fiber context switch. Issue #18663 has been updated by ioquatix (Samuel Williams). @fxn If I understand correctly, autoload is mostly a feature of a development environment, so if we made this a little bit slower in order to improve accuracy (i.e. using a proper mutex), it wouldn't be huge loss right? Ruby's mutex isn't that slow but I realise if we took this route, it would introduce some overhead. ---------------------------------------- Bug #18663: Autoload doesn't work with fiber context switch. https://bugs.ruby-lang.org/issues/18663#change-97038 * 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: