From: Yusuke Endoh Date: 2010-04-27T22:55:07+09:00 Subject: [ruby-dev:41082] [Bug #2398] race condition of /#{ foo }/o チケット #2398 が更新されました。 (by Yusuke Endoh) 担当者 Nobuyoshi NakadaからYusuke Endohに変更 Target version 1.9.2にセット ruby -v -にセット 遠藤です。 とりあえず、最初に once 区間に突入した (onceinlinecache を実行した) スレッドが once 区間を脱出する (setinlinecache を実行する) まで、 2 番目以降に同じ区間に突入するスレッドをブロックするパッチを書きま した。 最初のスレッドが正常に出口に到達しなかった場合、2 番目以降に突入した スレッドたちは永久にブロックしてしまいますが、SEGV よりましですし、 Ctrl+C で止めることもできるので、いいかなと思います。 そもそもそういう状況になるようなプログラムに問題があると言えるかも しれません。 すぐにコミットしてしまいますが、反対があったら言ってください。 diff --git a/insns.def b/insns.def index 9541465..ba6f1d6 100644 --- a/insns.def +++ b/insns.def @@ -1199,10 +1199,17 @@ onceinlinecache () (VALUE val) { + retry: if (ic->ic_vmstat) { val = ic->ic_value.value; JUMP(dst); } + else if (ic->ic_value.value == Qundef) + { + RUBY_VM_CHECK_INTS(); + rb_thread_schedule(); + goto retry; + } else { /* none */ ic->ic_value.value = Qundef; -- Yusuke Endoh ---------------------------------------- http://redmine.ruby-lang.org/issues/show/2398 ---------------------------------------- http://redmine.ruby-lang.org