From e62c3127c077d153773e82cde373cad88e39bc20 Mon Sep 17 00:00:00 2001 From: HoneyryderChuck Date: Tue, 29 Oct 2024 17:58:27 +0000 Subject: [PATCH] refactoring class-hash to be ractor-safe mutable constants can't be shared across ractors; this changes that design to define the required variables as constants on the Resource class, which makes them reachable using ractors; the ClassHash is kept in order not to break integrations relying on its existence, but under the hood it's doing the same thing --- lib/resolv.rb | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/resolv.rb b/lib/resolv.rb index ff62d87..30320ed 100644 --- a/lib/resolv.rb +++ b/lib/resolv.rb @@ -1699,7 +1699,14 @@ class Resource < Query attr_reader :ttl - ClassHash = {} # :nodoc: + ClassHash = Module.new do + module_function + + def []=(type_class_value, klass) + type_value, class_value = type_class_value + Resource.const_set(:"Type#{type_value}_Class#{class_value}", klass) + end + end def encode_rdata(msg) # :nodoc: raise NotImplementedError.new @@ -1737,8 +1744,10 @@ def hash # :nodoc: end def self.get_class(type_value, class_value) # :nodoc: - return ClassHash[[type_value, class_value]] || - Generic.create(type_value, class_value) + cached = const_defined?(:"Type#{type_value}_Class#{class_value}") && + const_get(:"Type#{type_value}_Class#{class_value}") + + return cached || Generic.create(type_value, class_value) end ## @@ -2907,4 +2916,3 @@ def DefaultResolver.replace_resolvers new_resolvers AddressRegex = /(?:#{IPv4::Regex})|(?:#{IPv6::Regex})/ end -