杉浦です。

>>> In Message "[ruby-dev:27752] Re: Thread deadlock when signale handler raise exception"
>>>            <20051118202630.084A5720.ocean / m2.ccsnet.ne.jp>,
>>> H.Yamamoto <ocean / m2.ccsnet.ne.jp>  said;
> >いまいち絞れないのですが、デッドロックする状況を見つけました。
> >単に私のやり方が悪いのかもと思ったのですが、入出力を伴うと現象が変わる
> >と言う不思議な状況なので、多分バグだろうと言うことでレポートします。
> >整理できていないので長いですがご勘弁下さい。
> >ruby 1.8.4 (2005-10-29) [i486-linux] で確認しています。

> ruby 1.9.0 でも再現しますか?また、enable-pthread でビルドしましたか?

> no / yes の場合は、多分「マルチスレッドだとシグナルが ruby インタプリタ
> スレッドに届くとは限らない」問題ではないかと思います。[ruby-dev:25713]

うーむ。(多少現象は違いますが)pthread が無効でも起こりました。

前述の 1.8.4 は Debian package (sid) のもので enable-pthread は
有効になっています。

新たに CVS かも取ってきた ruby 1.9.0 (2005-11-19) を enable-pthread
無しとあり両方でコンパイルして試してみました。

enable-pthread が有効な 1.9 では同じ現象が起きます。

enable-pthread 無しのバージョンだと、

sugi@tempest:~% /usr/local/ruby1.9-np/bin/ruby -rtimeout -rthread \
> -e 'trap(:INT){exit}; timeout(3){ Queue.new.pop }'

を実行して、 Ctrl+c を1回押すと、タイムアウトもせずデッドロックして
しまいます。


ターミナルから起動しているものなら単に Ctrl+c を何回か押せばいいので
それほどに問題はないのですが、tDiary を FastCGI で動かす時にちょっと
困っています。

FastCGI アプリケーションがプロセスマネージャから TERM を受け取った場合、
現在処理中のサイクルを完了して終了しないといけないのですが、時々これが
resolv.rb 中のコードの queue timeout で待っている時に飛んできます。

するとここでデッドロックしまい、マネージャから刺さっているとみなされて
強制的に KILL され、最終的にユーザにエラーが帰ります。

-- 
Tatsuki Sugiura   mailto:sugi / nemui.org