From: nobu@... Date: 2006-07-30T00:17:28+09:00 Subject: [ruby-dev:29176] Re: Thread deadlock when signale handler raise exception なかだです。 At Mon, 21 Nov 2005 14:27:26 +0900, Tanaka Akira wrote in [ruby-dev:27780]: > > 以下の状況 > > > > * スレッドが2つ以上あって > > * trap に exit するか、例外を起こすブロック(proc)を渡しておく > > > > で、シグナルハンドラが呼ばれるとデッドロックしてしまいます。 > > ちょっと調べてみたのですが、sleep 中に trap から 例外/exit > で出たときには main スレッドが THREAD_STOP なままで動いてい > るようですね。 見落としてたような忘れてたような。 > どこか適切なところで THREAD_RUNNABLE に変えればいいように思 > いますが... さて、どこで? これでどうでしょうか。 * eval.c (rb_trap_eval): make the current thread runnable to deal with exceptions which occurred within the trap. Index: eval.c =================================================================== RCS file: /cvs/ruby/src/ruby/eval.c,v retrieving revision 1.616.2.185 diff -p -u -2 -r1.616.2.185 eval.c --- eval.c 24 Jul 2006 13:04:39 -0000 1.616.2.185 +++ eval.c 29 Jul 2006 15:07:56 -0000 @@ -9940,4 +9940,5 @@ rb_trap_eval(cmd, sig, safe) if (state) { rb_trap_immediate = 0; + rb_thread_ready(curr_thread); JUMP_TAG(state); } -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦