Module: RactorRailsShim::Freezers::GlobalClassIvarFreezer

Extended by:
RoleDefaults
Defined in:
lib/ractor_rails_shim/roles/freezers.rb

Constant Summary collapse

TARGETS =

Mutable target list — downstream apps can register their own global classes via add_target without monkey-patching. Read at boot time (main Ractor only) before workers spawn.

%w[Time Date DateTime I18n]

Class Method Summary collapse

Methods included from RoleDefaults

default_funnel, default_reassign_shareable_const, default_safe_const_get

Class Method Details

.add_target(class_name) ⇒ Object



133
134
135
# File 'lib/ractor_rails_shim/roles/freezers.rb', line 133

def self.add_target(class_name)
  TARGETS << class_name unless TARGETS.include?(class_name)
end

.callObject



137
138
139
140
141
142
143
144
145
146
147
148
149
# File 'lib/ractor_rails_shim/roles/freezers.rb', line 137

def self.call
  classes = TARGETS.filter_map { |n| safe_const_get.call(n) }
  classes.each do |klass|
    klass.instance_variables.each do |ivar|
      val = klass.instance_variable_get(ivar)
      next if Ractor.shareable?(val)
      funnel.call("freeze global ivar #{klass}#{ivar}") do
        Ractor.make_shareable(val)
      end
    end
  end
  true
end

.configure(funnel: nil, safe_const_get: nil) ⇒ Object



110
111
112
113
# File 'lib/ractor_rails_shim/roles/freezers.rb', line 110

def self.configure(funnel: nil, safe_const_get: nil)
  @funnel = funnel
  @safe_const_get = safe_const_get
end

.funnelObject



120
121
122
# File 'lib/ractor_rails_shim/roles/freezers.rb', line 120

def self.funnel
  @funnel || default_funnel
end

.reset_configurationObject



115
116
117
118
# File 'lib/ractor_rails_shim/roles/freezers.rb', line 115

def self.reset_configuration
  @funnel = nil
  @safe_const_get = nil
end

.safe_const_getObject



124
125
126
# File 'lib/ractor_rails_shim/roles/freezers.rb', line 124

def self.safe_const_get
  @safe_const_get || default_safe_const_get
end