[#46329] [ruby-trunk - Feature #7252][Assigned] version number of 2.0 release — "usa (Usaku NAKAMURA)" <usa@...>

26 messages 2012/11/01

[#46350] RubySpecメンテナ — Yukihiro Matsumoto <matz@...>

まつもと ゆきひろです

15 messages 2012/11/02
[#46352] Re: RubySpecメンテナ — Urabe Shyouhei <shyouhei@...> 2012/11/02

On 11/01/2012 07:43 PM, Yukihiro Matsumoto wrote:

[#46414] [ruby-trunk - Bug #7287][Open] please rename atomic.h which conflicts with /usr/include/atomic.h in Solaris10 — "ngoto (Naohisa Goto)" <ngotogenome@...>

10 messages 2012/11/06

[#46434] トラップハンドラで許されない操作はなにか — KOSAKI Motohiro <kosaki.motohiro@...>

GyRCPi46aiRHJDkbKEIKCltCdWcgIzcxMzRdIBskQiRyRDQkWSRGJCQkRj88SiUkSjtFTU1MZEJq

9 messages 2012/11/06

[#46440] [ruby-trunk - Bug #7300][Open] Hash#[] の挙動が 1.9.3 と異なっている — "hsbt (Hiroshi SHIBATA)" <shibata.hiroshi@...>

12 messages 2012/11/07

[#46477] Fwd: [ruby-changes:25559] shugo:r37616 (trunk): * vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo): — SASADA Koichi <ko1@...>

refinement を導入するときの性能に対する excuse が「method cache に殆どあ

20 messages 2012/11/11
[#46480] Re: Fwd: [ruby-changes:25559] shugo:r37616 (trunk): * vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo): — Shugo Maeda <shugo@...> 2012/11/11

前田です。

[#46488] Re: Fwd: [ruby-changes:25559] shugo:r37616 (trunk): * vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo): — SASADA Koichi <ko1@...> 2012/11/12

 ささだです.

[#46491] Re: Fwd: [ruby-changes:25559] shugo:r37616 (trunk): * vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo): — Shugo Maeda <shugo@...> 2012/11/12

前田です。

[#46493] Re: Fwd: [ruby-changes:25559] shugo:r37616 (trunk): * vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo): — SASADA Koichi <ko1@...> 2012/11/12

 ささだです.

[#46495] Re: Fwd: [ruby-changes:25559] shugo:r37616 (trunk): * vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo): — Shugo Maeda <shugo@...> 2012/11/12

前田です。

[#46497] Re: Fwd: [ruby-changes:25559] shugo:r37616 (trunk): * vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo): — SASADA Koichi <ko1@...> 2012/11/12

(2012/11/12 18:20), Shugo Maeda wrote:

[#46501] Re: Fwd: [ruby-changes:25559] shugo:r37616 (trunk): * vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo): — Shugo Maeda <shugo@...> 2012/11/12

前田です。

[#46513] Re: Fwd: [ruby-changes:25559] shugo:r37616 (trunk): * vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo): — Nobuyoshi Nakada <nobu@...> 2012/11/14

なかだです。

[#46509] [ruby-trunk - Bug #7344][Open] gem pristine bigdecimal が失敗してしまう — "hsbt (Hiroshi SHIBATA)" <shibata.hiroshi@...>

31 messages 2012/11/13

[#46520] [ruby-trunk - Bug #7356][Open] ruby-2.0.0-preview1 で adlint-2.6.10 が性能劣化 — "yanoh (Yutaka Yanoh)" <yutaka@...>

11 messages 2012/11/15

[#46647] [ruby-trunk - Bug #7452][Assigned] Main thread is stopped after running finalizers if the main thread has a finalizer — "mrkn (Kenta Murata)" <muraken@...>

8 messages 2012/11/28

[ruby-dev:46653] [ruby-trunk - Bug #7452] Main thread is stopped after running finalizers if the main thread has a finalizer

From: "authorNari (Narihiro Nakamura)" <authorNari@...>
Date: 2012-11-28 12:42:40 UTC
List: ruby-dev #46653
Issue #7452 has been updated by authorNari (Narihiro Nakamura).


バグの原因がわかりました。
ファイナライザに登録したメインスレッドはRubyプロセス終了時のファイナライザ実行時(rb_objspace_call_finalizer)でfreelistに追加されてしまっているようです。

(gdbのバックトレース)
#0  add_slot_local_freelist (objspace=0x5555559ed8f0, p=0x555555a5be48) at gc.c:819
#1  0x00005555555c7f42 in finalize_list (objspace=0x5555559ed8f0, p=0x555555a5be48) at gc.c:1423
#2  0x00005555555c7fd5 in finalize_deferred (objspace=0x5555559ed8f0) at gc.c:1443
#3  0x00005555555c81ee in rb_objspace_call_finalizer (objspace=0x5555559ed8f0) at gc.c:1509
#4  0x00005555555c81a6 in rb_gc_call_finalizer_at_exit () at gc.c:1493
#5  0x00005555555b1b5a in ruby_finalize_1 () at eval.c:127
#6  0x00005555555b1dbb in ruby_cleanup (ex=0) at eval.c:193
#7  0x00005555555b20a7 in ruby_run_node (n=0x555555a581e8) at eval.c:307
#8  0x00005555555746b9 in main (argc=3, argv=0x7fffffffd248) at main.c:36

rb_objspace_call_finalizer()呼び出し後にruby_vm_destruct(VMのデストラクタ)が動き、そのデストラクタではメインスレッドを使うのですが、上記の通りfreeされてしまっているのでうまくいかないようですね。
これはメインスレッドに限った話ではなく、rb_objspace_call_finalizer()呼び出し後に触る可能性があるオブジェクトにファイナライザを登録するのがまずいみたいです。

ややad-hocですが、こんな感じでなおしてみました。
https://gist.github.com/4160845
VMから見えているものはとりあえずマークしておいて、通常のファイナライズは回避し、強制的なファイナライズでそれらを実行させるようにしています。

もしかしたら以下のパッチのようにほとんど強制的なファイナライズにしてもいいかなあと思いますが、こっちはちょっと自信がないです。
Rubyのファイナライズ周りに詳しい方の意見を伺いたいところです。。。

diff --git a/gc.c b/gc.c
index 63869a0..8d68e38 100644
--- a/gc.c
+++ b/gc.c
@@ -1505,15 +1505,9 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
     if (ATOMIC_EXCHANGE(finalizing, 1)) return;
 
     /* run finalizers */
-    do {
-       finalize_deferred(objspace);
-       /* mark reachable objects from finalizers */
-       /* They might be not referred from any place here */
-       mark_tbl(objspace, finalizer_table);
-       gc_mark_stacked_objects(objspace);
-       st_foreach(finalizer_table, chain_finalized_object,
-                  (st_data_t)&deferred_final_list);
-    } while (deferred_final_list);
+    finalize_deferred(objspace);
+    assert(deferred_final_list == 0);
+
     /* force to run finalizer */
     while (finalizer_table->num_entries) {
        struct force_finalize_list *list = 0;

----------------------------------------
Bug #7452: Main thread is stopped after running finalizers if the main thread has a finalizer
https://bugs.ruby-lang.org/issues/7452#change-34081

Author: mrkn (Kenta Murata)
Status: Assigned
Priority: Normal
Assignee: authorNari (Narihiro Nakamura)
Category: core
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-11-28 trunk 37923) [x86_64-darwin11.4.2]


以下のようにメインスレッドにファイナライザを登録すると、ファイナライザ実行後に止まってしまいます。

   ObjectSpace.define_finalizer(Thread.main) {}

trunk と ruby_1_9_3 ブランチの先頭で発生することを確認しています。

trunk は以下の gist に貼った patch で修正できました。
https://gist.github.com/4159481

1.9.3 は以下の gist に貼った patch で修正できました。
https://gist.github.com/4159480


-- 
http://bugs.ruby-lang.org/

In This Thread