| Module | Finalizer |
| In: |
lib/finalize.rb
|
Usage:
add dependency R_method(obj, dependant)
add(obj, dependant, method = :finalize, *opt) add_dependency(obj, dependant, method = :finalize, *opt)
delete dependency R_method(obj, dependant)
delete(obj_or_id, dependant, method = :finalize) delete_dependency(obj_or_id, dependant, method = :finalize)
delete dependency R_*(obj, dependant)
delete_all_dependency(obj_or_id, dependant)
delete dependency R_method(*, dependant)
delete_by_dependant(dependant, method = :finalize)
delete dependency R_*(*, dependant)
delete_all_by_dependant(dependant)
delete all dependency R_*(*, *)
delete_all
finalize the dependant connected by dependency R_method(obj, dependtant).
finalize(obj_or_id, dependant, method = :finalize) finalize_dependency(obj_or_id, dependant, method = :finalize)
finalize all dependants connected by dependency R_*(obj, dependtant).
finalize_all_dependency(obj_or_id, dependant)
finalize the dependant connected by dependency R_method(*, dependtant).
finalize_by_dependant(dependant, method = :finalize)
finalize all dependants connected by dependency R_*(*, dependant).
finalize_all_by_dependant(dependant)
finalize all dependency registered to the Finalizer.
finalize_all
stop invoking Finalizer on GC.
safe{..}
| RCS_ID | = | '-$Id: finalize.rb,v 1.4 1998/02/27 05:34:33 keiju Exp keiju $-' |
| add_dependency | -> | add |
| delete_dependency | -> | delete |
| finalize_dependency | -> | finalize |
add dependency R_method(obj, dependant)
# File lib/finalize.rb, line 58
58: def add_dependency(obj, dependant, method = :finalize, *opt)
59: ObjectSpace.call_finalizer(obj)
60: method = method.intern unless method.kind_of?(Integer)
61: assoc = [dependant, method].concat(opt)
62: if dep = @dependency[obj.object_id]
63: dep.push assoc
64: else
65: @dependency[obj.object_id] = [assoc]
66: end
67: end
delete dependency R_*(*, dependant)
# File lib/finalize.rb, line 106
106: def delete_all_by_dependant(dependant)
107: for id in @dependency.keys
108: delete_all_dependency(id, dependant)
109: end
110: end
delete dependency R_*(obj, dependant)
# File lib/finalize.rb, line 85
85: def delete_all_dependency(id, dependant)
86: id = id.object_id unless id.kind_of?(Integer)
87: method = method.intern unless method.kind_of?(Integer)
88: for assoc in @dependency[id]
89: assoc.delete_if do
90: |d, m, *o|
91: d == dependant
92: end
93: @dependency.delete(id) if assoc.empty?
94: end
95: end
delete dependency R_method(*, dependant)
# File lib/finalize.rb, line 98
98: def delete_by_dependant(dependant, method = :finalize)
99: method = method.intern unless method.kind_of?(Integer)
100: for id in @dependency.keys
101: delete(id, dependant, method)
102: end
103: end
delete dependency R_method(obj, dependant)
# File lib/finalize.rb, line 71
71: def delete_dependency(id, dependant, method = :finalize)
72: id = id.object_id unless id.kind_of?(Integer)
73: method = method.intern unless method.kind_of?(Integer)
74: for assoc in @dependency[id]
75: assoc.delete_if do
76: |d, m, *o|
77: d == dependant && m == method
78: end
79: @dependency.delete(id) if assoc.empty?
80: end
81: end
finalize all dependants connected by dependency R_*(*, dependtant)
# File lib/finalize.rb, line 149
149: def finalize_all_by_dependant(dependant)
150: for id in @dependency.keys
151: finalize_all_dependency(id, dependant)
152: end
153: end
finalize all dependants connected by dependency R_*(obj, dependtant)
# File lib/finalize.rb, line 128
128: def finalize_all_dependency(id, dependant)
129: id = id.object_id unless id.kind_of?(Integer)
130: method = method.intern unless method.kind_of?(Integer)
131: for assoc in @dependency[id]
132: assoc.delete_if do
133: |d, m, *o|
134: d.send(m, id, *o) if ret = d == dependant
135: end
136: @dependency.delete(id) if assoc.empty?
137: end
138: end
finalize the dependant connected by dependency R_method(*, dependtant)
# File lib/finalize.rb, line 141
141: def finalize_by_dependant(dependant, method = :finalize)
142: method = method.intern unless method.kind_of?(Integer)
143: for id in @dependency.keys
144: finalize(id, dependant, method)
145: end
146: end
finalize the depandant connected by dependency R_method(obj, dependtant)
# File lib/finalize.rb, line 113
113: def finalize_dependency(id, dependant, method = :finalize)
114: id = id.object_id unless id.kind_of?(Integer)
115: method = method.intern unless method.kind_of?(Integer)
116: for assocs in @dependency[id]
117: assocs.delete_if do
118: |d, m, *o|
119: d.send(m, id, *o) if ret = d == dependant && m == method
120: ret
121: end
122: @dependency.delete(id) if assoc.empty?
123: end
124: end
method to call finalize_* safely.
# File lib/finalize.rb, line 166
166: def safe
167: old_status = Thread.critical
168: Thread.critical = true
169: ObjectSpace.remove_finalizer(@proc)
170: begin
171: yield
172: ensure
173: ObjectSpace.add_finalizer(@proc)
174: Thread.critical = old_status
175: end
176: end
registering function to ObjectSpace#add_finalizer
# File lib/finalize.rb, line 181
181: def final_of(id)
182: if assocs = @dependency.delete(id)
183: for dependant, method, *opt in assocs
184: dependant.send(method, id, *opt)
185: end
186: end
187: end