Report abuse

run_this.rb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
module BarForTestRequireOnce; end

$foo = 0
BarForTestRequireOnce.autoload :Foo, "foo_for_test_autoload_once"
100.times do
  results = []
  (0...10).to_a.map do |x|
    Thread.new {results[x] = BarForTestRequireOnce::Foo}
  end.each {|t| t.join}
  raise "Concurrent autoloads caused double-loading" if results != [1] * 10
  $foo = 0
  BarForTestRequireOnce.autoload :Foo, "foo_for_test_autoload_once"
  $".pop
end

foo_for_test_autoload_once.rb

1
2
3
sleep 0.05
$foo += 1
BarForTestRequireOnce::Foo = $foo