From: Yusuke ENDOH Date: 2011-07-02T18:49:16+09:00 Subject: [ruby-dev:44017] Re: [ruby-core:37707] [Ruby 1.9 - Bug #3781] FIBER_USE_NATIVE が有効だと落ちるスクリプトがある 遠藤です。 # 以下、自信ありげに言っていますが、全く無いので間違ってたらすみません 2011年7月2日14:04 Narihiro Nakamura : > gc.cのstack_check()の役割としては > 「lev(gc_mark()に渡される引数)がGC_LEVEL_MAX(250)の範囲でgc_mark() > を呼び出せるほどの余りがマシンスタックにあるかチェックする」 > のように読めます。 stack_check() は lev とか関係なく「現在からスタックを GC_WATER_MARK だけ 伸ばしても大丈夫か」をチェックするものだと思います。 で、スタック増加量が GC_WATER_MARK を超えそうになる毎に stack_check() を 再度呼ぶ、というのが期待されている使い方ではないでしょうか。なので、 > ただ、GC_WATER_MARKが512しかないので、そのチェックがうまくいってません。 > GC_WATER_MARK = (gc_mark()フレームサイズ + gc_mark_children()フレームサイズ) * GC_LEVEL_MAX > となるべきだと思います。 ではなく、 GC_WATER_MARK >= (gc_mark()フレームサイズ + gc_mark_children()フレームサイズ) でよいと思います。 しかし、GC_WATER_MARK = 512 でこの条件は満たされているような気がします。 よって、本当の原因は別にあり、まだ特定出来ていないのではないでしょうか。 > 私の環境(Linux 2.6.39-0-generic x86_64, gcc 4.5.2)ではgc_mark()と > gc_mark_children()のフレームが28ワードだったので、とりあえず以下のよう > に修正したいのですが、どうでしょうか? なのでこの修正は、とりあえず予備をもたせたから現象が収まっただけではないか と思います。が、現象が収まり、大きな性能劣化等が起きないのなら、とりあえず コミットすることに反対ではありません。 -- Yusuke Endoh