ObjectSpace.define_finalizer does not run some procedure structures

P

paul.denize

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 -------
DONE
Object 20691624 dying at Thu Jan 18 09:55:38 New Zealand Standard Time
2007
 
R

Robert Klemme

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 -------
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
 
A

ara.t.howard

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! ;-)

-a
 
R

Robert Klemme

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! ;-)

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.

10:35:25 [Temp]: ruby fin.rb
test4 136802980 2
test4 136802980 3
test3 136803090 1
test3 136803090 2
test2 136803180 1
test2 136803180 2
test1 136803250 1
test1 136803250 2
10:36:20 [Temp]: cat fin.rb

def test1
o = Object.new
ObjectSpace.define_finalizer(o) {|id| puts "test1 #{id} 1"}
ObjectSpace.define_finalizer(o) {|id| puts "test1 #{id} 2"}
end

def test2
o = Object.new
ObjectSpace.define_finalizer(o) {|id| puts "test2 #{id} 1"}
ObjectSpace.define_finalizer(o) {|id| puts "test2 #{id} 2"}
ObjectSpace.define_finalizer(o) {|id| puts "test2 #{id} 3 #{o.inspect}"}
end

def test3
o = Object.new
ObjectSpace.define_finalizer(o) {|id| puts "test3 #{id} 1"}
ObjectSpace.define_finalizer(o) {|id| puts "test3 #{id} 2"}

o.instance_eval do
ObjectSpace.define_finalizer(o) {|id| puts "test3 #{id} 3 #{inspect}"}
end
end

def test4
o = Object.new
o.instance_eval do
ObjectSpace.define_finalizer(o) {|id| puts "test4 #{id} 1 #{inspect}"}
end

ObjectSpace.define_finalizer(o) {|id| puts "test4 #{id} 2"}
ObjectSpace.define_finalizer(o) {|id| puts "test4 #{id} 3"}
end

test1
test2
test3
test4
10:36:27 [Temp]:

Cheers

robert
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,776
Messages
2,569,603
Members
45,189
Latest member
CryptoTaxSoftware

Latest Threads

Top