1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@837 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2000-07-17 09:38:10 +00:00
parent 23dd3051c0
commit 448e63d627
13 changed files with 114 additions and 147 deletions

View file

@ -18,33 +18,33 @@ class WeakRef<Delegator
ID_MAP = {} # obj -> [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<Delegator
false
end
end
def []
__getobj__
end
end
if __FILE__ == $0