Bug #3262
closedcan't create fiber & SEGV in windows
Description
=begin
windowsにおいて fiber が作れなくなってSEGVする事があります。
[BUG] Segmentation fault
ruby 1.9.2dev (2010-05-09 trunk 27684) [i386-mswin32_90]
-- control frame ----------
c:0001 p:---- s:0001 b:-001 l:000000 d:000000 ------
再現環境は作れてませんが、こちらではnmake test-allしたときのtest_many_fibersで必ず落ちました。
#単体でtest_fiber.rbを動かしても落ちない。。。
作成に失敗する場合のエラーを調べると「このコマンドを実行するのに十分な記憶域がありません。」と言われています。
またSEGVが発生するのは生成に失敗した場合にチェックが入っておらず無効なハンドルへ切り替えようとするからです。
( SwitchToFiber(0); を実行して落ちる。)
これらを解消するために以下のパッチを当てたところ今は動いていますが、Fiberの理論的な制限数に対して実際に生成できてる数が合ってるのかわからず、根本的な解決になってるのかわかりません。
Index: cont.c¶
--- cont.c (リビジョン 27685)
+++ cont.c (作業コピー)
@@ -548,6 +548,14 @@
#ifdef _WIN32
fib->fib_handle = CreateFiberEx(size - 1, size, 0, fiber_entry, NULL);
- if(fib->fib_handle==NULL){
-
//try release unnecessary fibers & retry create
-
rb_gc();
-
fib->fib_handle = CreateFiberEx(size - 1, size, 0, fiber_entry, NULL);
-
if(fib->fib_handle==NULL){
-
rb_raise(rb_eFiberError, "can't create fiber");
-
}
- }
#else /* not WIN32 */
ucontext_t *context = &fib->context;
ちなみに手元でnmake test-allで走らせた場合では1300個から1600個弱生成するたびに領域が足りないと言われてるようなのですが、
これは何が影響してきまるんでしょうか?
=end
Updated by nobu (Nobuyoshi Nakada) over 14 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
=begin
This issue was solved with changeset r27701.
masaya, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
=end