Issue #12688 has been updated by Koichi Sasada.

Status changed from Assigned to Feedback

I can't reproduce headius's issue. It shows 50 dots and stop at next iteration because autoload is failed.

Inserting `$".pop` Shirosaki san suggested, I don't get any exception.

I tried on current trunk.


```
$LOAD_PATH.unshift __dir__

Thread.abort_on_exception = true

loop do
  class Foo
    autoload :Bar, 'bar.rb'
  end

  go = false
  threads = (1..50).map {Thread.new { 1 until go; Foo.const_get(:Bar); print '!' }}
  go = true
  threads.each(&:join)
  puts

  self.class.send :remove_const, :Foo
  $".pop
end
```



----------------------------------------
Bug #12688: Thread unsafety in autoload
https://bugs.ruby-lang.org/issues/12688#change-62685

* Author: Charles Nutter
* Status: Feedback
* Priority: Normal
* Assignee: Koichi Sasada
* Target version: 
* ruby -v: 2.3.0
* Backport: 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN
----------------------------------------
I need clarification here. I expected, based on Ruby's assertion that autoloads are thread-safe, that the following code would never error. Instead, it gets a couple iterations in and raises NameError:

```ruby
loop do
  class Foo
    autoload :Bar, 'bar.rb'
  end

  go = false
  threads = (1..50).map {Thread.new { 1 until go; print '.'; Foo.const_get(:Bar) }}
  go = true
  threads.each(&:join)
  puts

  self.class.send :remove_const, :Foo
end
```

And the output with Ruby 2.3.0:

```
$ ruby23 -I. autoload_breaker.rb 
..................................................
..................................................autoload_breaker.rb:7:in `const_get': uninitialized constant Foo::Bar (NameError)
Did you mean?  Foo::Bar
	from autoload_breaker.rb:7:in `block (3 levels) in <main>'
```

Is there something wrong with my script? Is my expectation incorrect?



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>