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{..}

Methods

Constants

RCS_ID = '-$Id: finalize.rb,v 1.4 1998/02/27 05:34:33 keiju Exp keiju $-'

External Aliases

add_dependency -> add
delete_dependency -> delete
finalize_dependency -> finalize

Public Class methods

add dependency R_method(obj, dependant)

[Source]

    # 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)

[Source]

     # 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)

[Source]

    # 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)

[Source]

     # 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)

[Source]

    # 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 registered to the Finalizer.

[Source]

     # File lib/finalize.rb, line 156
156:     def finalize_all
157:       for id, assocs in @dependency
158:         for dependant, method, *opt in assocs
159:           dependant.send(method, id, *opt)
160:         end
161:         assocs.clear
162:       end
163:     end

finalize all dependants connected by dependency R_*(*, dependtant)

[Source]

     # 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)

[Source]

     # 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)

[Source]

     # 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)

[Source]

     # 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.

[Source]

     # 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

Private Class methods

registering function to ObjectSpace#add_finalizer

[Source]

     # 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

[Validate]