[#41278] [BUG:1.9] BINARY should not be ASCII-compatible — Yugui <yugui@...>

Yuguiです。

15 messages 2010/05/11

[#41407] [Bug #3339] win32ole test failure — Usaku NAKAMURA <redmine@...>

Bug #3339: win32ole test failure

20 messages 2010/05/25
[#41411] Re: [Bug #3339] win32ole test failure — Masaki Suketa <masaki.suketa@...> 2010/05/25

助田です。

[#41412] Re: [Bug #3339] win32ole test failure — "U.Nakamura" <usa@...> 2010/05/25

こんにちは、なかむら(う)です。

[ruby-dev:41230] [Bug #3262] can't create fiber & SEGV in windows

From: masaya tarui <redmine@...>
Date: 2010-05-08 21:48:12 UTC
List: ruby-dev #41230
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

In This Thread

Prev Next