遠藤です。

# 以下、自信ありげに言っていますが、全く無いので間違ってたらすみません


2011年7月2日14:04 Narihiro Nakamura <authornari / gmail.com>:
> 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 <mame / tsg.ne.jp>