Class: WeakRef
Defined Under Namespace
Classes: RefError
Constant Summary collapse
- @@id_map =
obj -> [ref,…]
{}
- @@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) 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 } }
Instance Method Summary collapse
- #__getobj__ ⇒ Object
- #__setobj__(obj) ⇒ Object
-
#initialize(orig) ⇒ WeakRef
constructor
A new instance of WeakRef.
- #weakref_alive? ⇒ Boolean
Methods inherited from Delegator
#!, #!=, #==, const_missing, delegating_block, #freeze, #marshal_dump, #marshal_load, #method, #method_missing, #methods, #protected_methods, public_api, #public_methods, #respond_to_missing?
Constructor Details
#initialize(orig) ⇒ WeakRef
Returns a new instance of WeakRef.
41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/knj/rhodes/weakref.rb', line 41 def initialize(orig) @__id = orig.object_id ObjectSpace.define_finalizer orig, @@final ObjectSpace.define_finalizer self, @@final @@mutex.synchronize { @@id_map[@__id] = [] unless @@id_map[@__id] } @@id_map[@__id].push self.object_id @@id_rev_map[self.object_id] = @__id super end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method in the class Delegator
Instance Method Details
#__getobj__ ⇒ Object
53 54 55 56 57 58 59 60 61 62 |
# File 'lib/knj/rhodes/weakref.rb', line 53 def __getobj__ unless @@id_rev_map[self.object_id] == @__id Kernel::raise RefError, "Invalid Reference - probably recycled", Kernel::caller(2) end begin ObjectSpace._id2ref(@__id) rescue RangeError Kernel::raise RefError, "Invalid Reference - probably recycled", Kernel::caller(2) end end |
#__setobj__(obj) ⇒ Object
63 64 |
# File 'lib/knj/rhodes/weakref.rb', line 63 def __setobj__(obj) end |
#weakref_alive? ⇒ Boolean
66 67 68 |
# File 'lib/knj/rhodes/weakref.rb', line 66 def weakref_alive? @@id_rev_map[self.object_id] == @__id end |