When I run the code below only the first finalizer runs. The others
two don't seem to run. I found similar posts on other sites, but no
solutions.
You can duplicate the first and it runs twice (so two finalizers is
ok).
To me they are all somewhat identical. Can anyone tell me why it does
not work.
I have a number of machines that run testware in ruby 152 so I'd like
to KNOW that upgrading will fix the problem before taking this path.
Paul
------- Test.rb --------
class MyClass
def initialize
ObjectSpace.define_finalizer(self,self.class.method(:finalize).to_proc)
ObjectSpace.define_finalizer(self,proc{|id| puts "proc final
#{id}"})
ObjectSpace.define_finalizer(self,self.dofinalize)
end
def self.finalize(id)
puts "Object #{id} dying at #{Time.new}"
end
def self.f2(id)
puts "F2 #{id}"
end
def dofinalize
return Proc.new { |param|
puts "Doing finalize #{param[0]}"
}
end
end
MyClass.new
ObjectSpace.garbage_collect
puts "DONE"
-------- output -------
Test.rb
DONE
Object 20691624 dying at Thu Jan 18 09:55:38 New Zealand Standard Time
2007
There's a subtle difference between the first and the other two: the first one does not create a closure which binds "self" to the current instance. That might be an explanation.
Kind regards
robert
···
On 17.01.2007 22:00, paul.denize@datacom.co.nz wrote:
I have Ruby 182-15 on WinXP
When I run the code below only the first finalizer runs. The others
two don't seem to run. I found similar posts on other sites, but no
solutions.
You can duplicate the first and it runs twice (so two finalizers is
ok).
To me they are all somewhat identical. Can anyone tell me why it does
not work.
I have a number of machines that run testware in ruby 152 so I'd like
to KNOW that upgrading will fix the problem before taking this path.
Paul
------- Test.rb --------
class MyClass
def initialize
ObjectSpace.define_finalizer(self,self.class.method(:finalize).to_proc)
ObjectSpace.define_finalizer(self,proc{|id| puts "proc final
#{id}"})
ObjectSpace.define_finalizer(self,self.dofinalize)
end
def self.finalize(id)
puts "Object #{id} dying at #{Time.new}"
end
def self.f2(id)
puts "F2 #{id}"
end
def dofinalize
return Proc.new { |param|
puts "Doing finalize #{param[0]}"
}
end
end
MyClass.new
ObjectSpace.garbage_collect
puts "DONE"
-------- output -------
Test.rb
DONE
Object 20691624 dying at Thu Jan 18 09:55:38 New Zealand Standard Time
2007
finalizers cannot refer the to object being finalized. in the second and
third cases you hold a reference to the object (implicit in Proc.new/proc)
inside the created closures - thereby preventing them from being run.
inotherwords you've created finalizers that prevent the object from being
finalized!
-a
···
On Thu, 18 Jan 2007 paul.denize@datacom.co.nz wrote:
I have Ruby 182-15 on WinXP
When I run the code below only the first finalizer runs. The others
two don't seem to run. I found similar posts on other sites, but no
solutions.
You can duplicate the first and it runs twice (so two finalizers is
ok).
To me they are all somewhat identical. Can anyone tell me why it does
not work.
--
in the practice of tolerance, one's enemy is the best teacher.
- the dalai lama
Still the fact remains interesting that at least one of the other finalizers is being called when the process exits. So the "blocking" finalizers just block themselves but not other finalizers.
On Thu, 18 Jan 2007 paul.denize@datacom.co.nz wrote:
I have Ruby 182-15 on WinXP
When I run the code below only the first finalizer runs. The others
two don't seem to run. I found similar posts on other sites, but no
solutions.
You can duplicate the first and it runs twice (so two finalizers is
ok).
To me they are all somewhat identical. Can anyone tell me why it does
not work.
finalizers cannot refer the to object being finalized. in the second and
third cases you hold a reference to the object (implicit in Proc.new/proc)
inside the created closures - thereby preventing them from being run.
inotherwords you've created finalizers that prevent the object from being
finalized!