(2012/10/02 0:21), authorNari (Narihiro Nakamura) wrote:
> 
> Issue #7095 has been reported by authorNari (Narihiro Nakamura).
> 
> ----------------------------------------
> Bug #7095: Non-recursive marking
> https://bugs.ruby-lang.org/issues/7095
> 
> Author: authorNari (Narihiro Nakamura)
> Status: Open
> Priority: Normal
> Assignee: authorNari (Narihiro Nakamura)
> Category: core
> Target version: 2.0.0
> ruby -v: ruby 2.0.0dev (2012-09-25 trunk 37032) [x86_64-linux]
> 
> 
> nariです。
> 
> GCのマーキングで関数の再帰呼び出しを使わないバージョンを書いてみました。
> 
> 差分: https://github.com/authorNari/ruby/compare/non_recursion_marking
> パッチ: https://github.com/authorNari/ruby/compare/non_recursion_marking.patch
> 
> = 現状の問題点
> 現在のマークは、基本的にはオブジェクト、子オブジェクト、孫オブジェクト
> と、gc_mark()を再帰的に呼び出すという実装になっています。
> もしもオブジェクトがすごく深いグラフを持っていた場合にはマシンスタック
> が溢れてしまうので、GCが「あ、スタックが溢れそう」と判断するとそれ以上
> はマシンスタックを使わない方法でマークを行おうとします。

+1

遅くなっていない,ということで,デメリットが思いつかないのでよろしいの
じゃないかと思います.素晴らしい(パッチあんまり真面目に読んでないけど).


あまり本質じゃないんですが,
- page という言葉は適当でしょうか.
- GC の度に毎回 malloc? いいんだっけ.最初の1ページは最初に alloc する
からいいのかな.
- +#ifndef __LP64__ は本当にこれがやりたいんだろうか.あと -2 って何?

-- 
// SASADA Koichi at atdot dot net