From: Yusuke ENDOH Date: 2010-02-11T19:08:05+09:00 Subject: [ruby-dev:40394] Re: [Bug:trunk] rubyspec: ObjectSpace.define_finalizer doesn't call self-referencing finalizers FAILED 遠藤です。 2010年2月11日0:29 Yusuke ENDOH : > 以下のようにすると T_ZOMBIE が見えてしまうのはバグでしょうか。 > > > $ ./ruby -ve ' > obj = "test" > ObjectSpace.define_finalizer(obj, proc { begin; p obj; ensure; p $!; end }) > ' > ruby 1.9.2dev (2010-02-10 trunk 26632) [i686-linux] > # T_ZOMBIE object (0x8248df0 flags=0x3e klass=0x0)> 「T_ZOMBIE が見えたらバグ」というなかださんとささださんの認定を 頂きました。GC に興味ないので自信はないですが、一応調べました。 ruby 終了時に実行されそうな rb_objspace_call_finalizer の中で、 /* run finalizers */ という箇所があり、chain_finalized_object してから run_final をする、というようなコードがあります。 chain_finalized_object の中では FL_FINALIZE なオブジェクトは無 条件に T_ZOMBIE にされ、dfree が 0 にされます。そして run_final の中では T_ZOMBIE になったオブジェクトの finalizer を呼んでしま うようです。(間違ってたらすみません) 問題点 (疑問点) は 2 つあります。 1) dfree が 0 にされてしまったら、free が呼べなくなる気がする けれどいいのか? (どうせ終了直前だからいい? MVM になったら 困るかも) 2) 対象オブジェクトが強制的に T_ZOMBIE になってから finalizer が呼ばれるので当然 T_ZOMBIE なオブジェクトが finalizer から 見えるけれど、どうするのが正しい? GC に興味のある人に考えてほしいです。 -- Yusuke ENDOH