From d0c1eef51174701889767e1fed584d2d56d9f9c9 Mon Sep 17 00:00:00 2001 From: rm155 Date: Wed, 18 Aug 2021 16:51:13 -0400 Subject: [PATCH] [ruby/singleton] Only use RactorLocalSingleton if Ractor is defined https://github.com/ruby/singleton/commit/f684d36a47 --- lib/singleton.rb | 66 +++++++++++++++++++++++++----------------------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/lib/singleton.rb b/lib/singleton.rb index 4a47190e2b..924cbf1ae8 100644 --- a/lib/singleton.rb +++ b/lib/singleton.rb @@ -196,43 +196,45 @@ module Singleton # Returns the singleton instance. end -module RactorLocalSingleton - include Singleton::SingletonInstanceMethods +if defined?(Ractor) + module RactorLocalSingleton + include Singleton::SingletonInstanceMethods - module RactorLocalSingletonClassMethods - include Singleton::SingletonClassMethods - def instance - set_mutex(Thread::Mutex.new) if Ractor.current[mutex_key].nil? - return Ractor.current[instance_key] if Ractor.current[instance_key] - Ractor.current[mutex_key].synchronize { + module RactorLocalSingletonClassMethods + include Singleton::SingletonClassMethods + def instance + set_mutex(Thread::Mutex.new) if Ractor.current[mutex_key].nil? return Ractor.current[instance_key] if Ractor.current[instance_key] - set_instance(new()) - } - Ractor.current[instance_key] + Ractor.current[mutex_key].synchronize { + return Ractor.current[instance_key] if Ractor.current[instance_key] + set_instance(new()) + } + Ractor.current[instance_key] + end + + private + + def instance_key + :"__RactorLocalSingleton_instance_with_class_id_#{object_id}__" + end + + def mutex_key + :"__RactorLocalSingleton_mutex_with_class_id_#{object_id}__" + end + + def set_instance(val) + Ractor.current[instance_key] = val + end + + def set_mutex(val) + Ractor.current[mutex_key] = val + end end - private - - def instance_key - :"__RactorLocalSingleton_instance_with_class_id_#{object_id}__" + def self.module_with_class_methods + RactorLocalSingletonClassMethods end - def mutex_key - :"__RactorLocalSingleton_mutex_with_class_id_#{object_id}__" - end - - def set_instance(val) - Ractor.current[instance_key] = val - end - - def set_mutex(val) - Ractor.current[mutex_key] = val - end + extend Singleton::SingletonClassProperties end - - def self.module_with_class_methods - RactorLocalSingletonClassMethods - end - - extend Singleton::SingletonClassProperties end