From 086942d2eacb37a9dcc690a225190eac28af32ff Mon Sep 17 00:00:00 2001 From: rm155 Date: Sun, 18 Jul 2021 22:53:31 -0400 Subject: [PATCH] Improve Ractor-compliance --- lib/weakref.rb | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/lib/weakref.rb b/lib/weakref.rb index a8da39a..8188c5c 100644 --- a/lib/weakref.rb +++ b/lib/weakref.rb @@ -36,13 +36,13 @@ def initialize(orig) when true, false, nil @delegate_sd_obj = orig else - @@__map[self] = orig + weakref_map[self] = orig end super end def __getobj__ # :nodoc: - @@__map[self] or defined?(@delegate_sd_obj) ? @delegate_sd_obj : + weakref_map[self] or defined?(@delegate_sd_obj) ? @delegate_sd_obj : Kernel::raise(RefError, "Invalid Reference - probably recycled", Kernel::caller(2)) end @@ -53,6 +53,18 @@ def __setobj__(obj) # :nodoc: # Returns true if the referenced object is still alive. def weakref_alive? - @@__map.key?(self) or defined?(@delegate_sd_obj) + weakref_map.key?(self) or defined?(@delegate_sd_obj) end + + def weakref_map + if defined?(::Object::Ractor) + if Ractor.current[:__WeakRef_map__].nil? + Ractor.current[:__WeakRef_map__] = ::ObjectSpace::WeakMap.new + end + Ractor.current[:__WeakRef_map__] + else + @@__map + end + end + private :weakref_map end