ObjectSpace.define_finalizer does not run some procedure structures

Discussion in 'Ruby' started by paul.denize@datacom.co.nz, Jan 17, 2007.

  1. Guest

    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
    >
     
    , Jan 17, 2007
    #1
    1. Advertising

  2. On 17.01.2007 22:00, 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
    >


    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
     
    Robert Klemme, Jan 17, 2007
    #2
    1. Advertising

  3. Guest

    On Thu, 18 Jan 2007 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! ;-)

    -a
    --
    in the practice of tolerance, one's enemy is the best teacher.
    - the dalai lama
     
    , Jan 17, 2007
    #3
  4. On 17.01.2007 23:22, wrote:
    > On Thu, 18 Jan 2007 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! ;-)


    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
     
    Robert Klemme, Jan 18, 2007
    #4
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Showjumper
    Replies:
    2
    Views:
    293
    Showjumper
    Jan 28, 2004
  2. Alfonso Morra
    Replies:
    11
    Views:
    740
    Emmanuel Delahaye
    Sep 24, 2005
  3. james_b
    Replies:
    2
    Views:
    125
    james_b
    Aug 2, 2003
  4. Andres Salomon

    calling define_finalizer from within C?

    Andres Salomon, Oct 18, 2004, in forum: Ruby
    Replies:
    4
    Views:
    175
    Andres Salomon
    Oct 18, 2004
  5. ara.t.howard
    Replies:
    5
    Views:
    199
    Sylvain Joyeux
    Sep 25, 2007
Loading...

Share This Page