From: Charles Oliver Nutter Date: 2010-03-12T10:48:54+09:00 Subject: [ANN] weakling 0.0.1 - a reference queue and weak ID hash for JRuby Hi all! JRuby 1.5 will soon be released, in which ObjectSpace._id2ref does not function unless ObjectSpace is turned on. Since the typical pattern for _id2ref is to have a weak-valued hash of numeric IDs to objects, I've released a simple extension to JRuby that provides a weak id-to-object hash implementation plus support for weak reference queues. Comments, questions, suggestions are welcome. Announcing the "weakling" library! weakling: a collection of weakref utilities for Ruby (JRuby only for the moment) == Summary == This library provides: * a modified WeakRef implementation for JRuby that supports a reference queue * a WeakRef::RefQueue class * a weak-valued ID map to replace typical uses of _id2ref In the future it may provide additional features like a generic WeakHash or other reference types like soft and phantom references. The weakling repository is at http://github.com/headius/weakling. == Usage == Just require 'weakling'. It will require 'weakref' along with the refqueue JRuby extension and the weakling/collections library containing the weak id hash. == RefQueue Example == require 'weakling' require 'java' q = WeakRef::RefQueue.new wr = WeakRef.new(Object.new, q) puts "weakref object: #{wr.__id__}" puts "running GC" java.lang.System.gc puts "weakref alive?: #{wr.weakref_alive?}" puts "weakref object from queue: #{q.poll.__id__}" == WeakRef::IdHash Example == require 'weakling' wh = WeakRef::IdHash.new ary = (1..10).to_a.map {Object.new} ids = ary.map {|o| wh.add(o)} puts "all items in weak_id_hash:" ids.each {|i| puts "#{i} = #{wh[i]}"} puts "dereferencing objects" ary = nil puts "forcing GC" begin require 'java' java.lang.System.gc rescue GC.start end puts "all items in weak id hash:" ids.each {|i| puts "#{i} = #{wh[i]}"}