From: "U.Nakamura" Date: 2009-08-19T15:47:18+09:00 Subject: [ruby-dev:39126] Re: [Bug #1952] cannot stop with Ctrl+C こんにちは、なかむら(う)です。 In message "[ruby-dev:39107] [Bug #1952] cannot stop with Ctrl+C" on Aug.18,2009 23:50:32, wrote: > 以下のスクリプトがCtrl+Cで停止せず、Ctrl+C押下後はkill -9でしか殺せません。 調査を進めてみました。 当初はpthreadな環境依存かと思っていましたが、mswin32でも同じ 現象が起きました。 1.8だと、1回目のCtrl+Cでは停止せず、2回目のCtrl+Cで死にます。 とりあえずtrunkベースで現象を眺めてみると、 (1) Ctrl+C押下時点でmainスレッドとThread.newされたスレッド 両方がTHREAD_TO_KILLとなる。 (2) mainスレッドはTAG_FATALでrb_longjmp()された後、他のスレ ッドの死亡待ちループに入る。 (3) Thread.newされたスレッドの方はTAG_FATALでrb_longjmp()さ れ、sleepが中断される。 そこで内側のbegin〜end内のensure節に入るのでraiseが実行 される。 今度は外側のbegin〜end内のrescue節に入り、retryが実行さ れる。 以上の過程で、そもそもTAG_FATALだったことが忘れ去られて しまい、再びsleepが実行される。 (4) Thread.newされたスレッドがsleepで寝たきりなので、mainス レッドは延々と死亡待ちループを続ける。 再度Ctrl+Cを押しても、(3)が繰り返されるだけ。 ということになってるようです。 おそらく、(3)のTAG_FATALが忘れ去られるのが問題で、外側のrescue 節に入らないようにしないといけないのではないかと思います。 ensure節でraiseするとき、現在TAG_FATALだったらTAG_RAISEでなく TAG_FATALで飛ぶべきなんでしょうかねえ。難しい。 それでは。 -- U.Nakamura