From: Tomoyuki Chikanaga Date: 2011-07-01T00:18:07+09:00 Subject: [ruby-dev:44007] [Ruby 1.9 - Bug #4950] ほぼ同時に異なる種類のシグナルを受信すると片方のシグナルハンドラが実行されない Issue #4950 has been updated by Tomoyuki Chikanaga. シグナルがメインスレッドで処理されるまで配送を遅延しているので、タイマースレッドが polling をやめてしまうと配送が滞留するという問題みたいでした。 以下のように polling する条件に追加すると期待したような動作になりました。どうでしょうか。 diff --git a/thread_pthread.c b/thread_pthread.c index 4f66c4e..016c3e9 100644 --- a/thread_pthread.c +++ b/thread_pthread.c @@ -1085,7 +1085,7 @@ thread_timer(void *p) FD_ZERO(&rfds); FD_SET(timer_thread_pipe[0], &rfds); - if (gvl->waiting > 0 || need_polling) { + if (gvl->waiting > 0 || need_polling || rb_signal_buff_size() > 0) { timeout.tv_sec = 0; timeout.tv_usec = TIME_QUANTUM_USEC; ---------------------------------------- Bug #4950: ほぼ同時に異なる種類のシグナルを受信すると片方のシグナルハンドラが実行されない http://redmine.ruby-lang.org/issues/4950 Author: Tomoyuki Chikanaga Status: Open Priority: Normal Assignee: Category: core Target version: 1.9.3 ruby -v: ruby 1.9.3dev (2011-06-30 trunk 32335) [x86_64-darwin10.8.0] 以下のようなスクリプトを実行すると [1,2] か [2,1] が表示されることが期待されますが、 実際には [1] が表示されます(稀に [2] になることもあります)。 a = [] trap(:INT) { a.push(1) } trap(:TERM) { a.push(2) } pid = $$ fork do sleep 0.5 puts "send start" Process.kill(:INT, pid) Process.kill(:TERM, pid) puts "send end" end puts "sleep start" sleep 3 puts "sleep end" p a Signal.trap のブロック内で puts してみると、一方のシグナルハンドラが終了時に遅れて実行されているようです。 -- http://redmine.ruby-lang.org