From 448e63d627bf3653da0b3dc0dcf93e161829dc71 Mon Sep 17 00:00:00 2001 From: matz Date: Mon, 17 Jul 2000 09:38:10 +0000 Subject: matz git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@837 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/weakref.rb | 50 +++++++++++++++++++++++--------------------------- 1 file changed, 23 insertions(+), 27 deletions(-) (limited to 'lib/weakref.rb') diff --git a/lib/weakref.rb b/lib/weakref.rb index a6519e64c0..3307a2e5aa 100644 --- a/lib/weakref.rb +++ b/lib/weakref.rb @@ -18,33 +18,33 @@ class WeakRef [ref,...] ID_REV_MAP = {} # ref -> obj - ObjectSpace.add_finalizer(lambda{|id| - __old_status = Thread.critical - Thread.critical = true - begin - rids = ID_MAP[id] - if rids - for rid in rids - ID_REV_MAP[rid] = nil - end - ID_MAP[id] = nil - end - rid = ID_REV_MAP[id] - if rid - ID_REV_MAP[id] = nil - ID_MAP[rid].delete(id) - ID_MAP[rid] = nil if ID_MAP[rid].empty? - end - ensure - Thread.critical = __old_status - end - }) + @@final = lambda{|id| + __old_status = Thread.critical + Thread.critical = true + begin + rids = ID_MAP[id] + if rids + for rid in rids + ID_REV_MAP[rid] = nil + end + ID_MAP[id] = nil + end + rid = ID_REV_MAP[id] + if rid + ID_REV_MAP[id] = nil + ID_MAP[rid].delete(id) + ID_MAP[rid] = nil if ID_MAP[rid].empty? + end + ensure + Thread.critical = __old_status + end + } def initialize(orig) super @__id = orig.__id__ - ObjectSpace.call_finalizer orig - ObjectSpace.call_finalizer self + ObjectSpace.define_finalizer orig, @@final + ObjectSpace.defin_finalizer self, @@final ID_MAP[@__id] = [] unless ID_MAP[@__id] ID_MAP[@__id].push self.__id__ ID_REV_MAP[self.id] = @__id @@ -64,10 +64,6 @@ class WeakRef