[ruby-core:76999] [Ruby trunk Bug#12688] Thread unsafety in autoload
From:
h.shirosaki@...
Date:
2016-08-22 07:23:48 UTC
List:
ruby-core #76999
Issue #12688 has been updated by Hiroshi Shirosaki.
Charles Nutter wrote:
> 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
> ```
>
>
> Is there something wrong with my script? Is my expectation incorrect?
`$".pop` would be needed to clear `bar.rb` in loaded features.
I don't get `NameError` after adding `$".pop`.
----------------------------------------
Bug #12688: Thread unsafety in autoload
https://bugs.ruby-lang.org/issues/12688#change-60226
* Author: Charles Nutter
* Status: Open
* Priority: Normal
* Assignee:
* 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>