Project

General

Profile

Actions

Bug #19376

closed

Ability to read ivars of non-frozen classes/modules across ractors is not thread-safe

Added by luke-gru (Luke Gruber) over 2 years ago. Updated over 2 years ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:112038]

Description

This segfaults:

class C
  class << self
    attr_accessor :val
  end
end

GO = false
rs = 100.times.map do
  Ractor.new do
    Thread.pass until GO
    1000.times do
      val = C.val
      p val
    end
  end
end
ts = 100.times.map do |i|
  Thread.new do
    Thread.pass until GO
    1000.times do
      C.val = Object.new.freeze
    end
  end
end

GO = true
ts.each(&:join)
rs.each(&:take)

It looks like a silly example, but it can crash even if the main thread doesn't spawn any more threads. Getting/setting ivars on objects in parallel without VM lock isn't safe, so for non-frozen shareable objects (basically classes and modules), it's unsafe to access their instance variables even if the values are shareable.

Updated by luke-gru (Luke Gruber) over 2 years ago

  • Tracker changed from Bug to Misc
  • Subject changed from Ability to read ivars of non-frozen classes/modules across ractors is not thread-safe to (Please close) Ability to read ivars of non-frozen classes/modules across ractors is not thread-safe
  • Backport deleted (2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN)

Nevermind this is actually safe, I ran into a separate segfault that this example was giving that's unrelated to that thread-safety issue. I'll file separate bug.

Actions #2

Updated by hsbt (Hiroshi SHIBATA) over 2 years ago

  • Tracker changed from Misc to Bug
  • Subject changed from (Please close) Ability to read ivars of non-frozen classes/modules across ractors is not thread-safe to Ability to read ivars of non-frozen classes/modules across ractors is not thread-safe
  • Status changed from Open to Closed
  • Backport set to 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN
Actions

Also available in: Atom PDF

Like0
Like0Like0