diff --git a/lib/weakref.rb b/lib/weakref.rb index ee5444a..3929994 100644 --- a/lib/weakref.rb +++ b/lib/weakref.rb @@ -28,21 +28,26 @@ class WeakRef < Delegator @@id_rev_map = {} # ref -> obj @@mutex = Mutex.new @@final = lambda {|id| - @@mutex.synchronize { - rids = @@id_map[id] - if rids - for rid in rids - @@id_rev_map.delete(rid) + GC.disable + begin + @@mutex.synchronize { + rids = @@id_map[id] + if rids + for rid in rids + @@id_rev_map.delete(rid) + end + @@id_map.delete(id) + end + rid = @@id_rev_map[id] + if rid + @@id_rev_map.delete(id) + @@id_map[rid].delete(id) + @@id_map.delete(rid) if @@id_map[rid].empty? end - @@id_map.delete(id) - end - rid = @@id_rev_map[id] - if rid - @@id_rev_map.delete(id) - @@id_map[rid].delete(id) - @@id_map.delete(rid) if @@id_map[rid].empty? - end - } + } + ensure + GC.enable + end } ## @@ -52,9 +57,14 @@ class WeakRef < Delegator @__id = orig.object_id ObjectSpace.define_finalizer orig, @@final ObjectSpace.define_finalizer self, @@final - @@mutex.synchronize { - @@id_map[@__id] = [] unless @@id_map[@__id] - } + GC.disable + begin + @@mutex.synchronize { + @@id_map[@__id] = [] unless @@id_map[@__id] + } + ensure + GC.enable + end @@id_map[@__id].push self.object_id @@id_rev_map[self.object_id] = @__id super