From: masaya tarui Date: 2010-05-09T06:48:12+09:00 Subject: [ruby-dev:41230] [Bug #3262] can't create fiber & SEGV in windows Bug #3262: can't create fiber & SEGV in windows http://redmine.ruby-lang.org/issues/show/3262 起票者: masaya tarui ステータス: Open, 優先度: Normal カテゴリ: core, Target version: 1.9.2 ruby -v: ruby 1.9.2dev (2010-05-09 trunk 27684) [i386-mswin32_90] 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個弱生成するたびに領域が足りないと言われてるようなのですが、 これは何が影響してきまるんでしょうか? ---------------------------------------- http://redmine.ruby-lang.org