Project

General

Profile

Bug #5368

ensure節でsleepするようなThreadがあるとインタプリタが終了しない

Added by Glass_saga (Masaki Matsushita) over 8 years ago. Updated 10 months ago.

Status:
Closed
Priority:
Normal
Target version:
-
ruby -v:
-
Backport:
[ruby-dev:44546]

Description

=begin
次のコードを実行するとCPU使用率が跳ね上がった状態になりインタプリタが終了しません。

Thread.new do
begin
sleep
ensure
sleep
end
end

現在のrb_thread_terminate_allでは最初に1回だけ生きているスレッドに対してterminate_iを実行していますが、ensure節でsleepするようなThreadがあると、そのThreadは寝たままになってしまいwhile(!rb_thread_alone())が無限ループになってしまいます。

while(!rb_thread_alone())の毎回のループでカレントスレッドがメインスレッドであった場合に、生きているスレッドに対してterminate_iを実行するようなpatchを書いたところ、このバグは再現しなくなりました。
patchを添付します。patchの適用後もtest-allをパスします。
=end


Files

patch.diff (795 Bytes) patch.diff Glass_saga (Masaki Matsushita), 09/26/2011 01:51 PM

Related issues

Related to Ruby master - Feature #1952: cannot stop with Ctrl+CClosedko1 (Koichi Sasada)08/18/2009Actions
Related to Ruby master - Bug #7460: メインスレッド終了後のサブスレッド終了待ち処理においてデッドロック検知が動作していないClosedkosaki (Motohiro KOSAKI)Actions

Also available in: Atom PDF