gc
data_ = new(PointerFreeGC) UCS4Char[bufferSize_];
Boehm GC の続き。 GC Warning: Finalization cycle involving 57204347 GC動作中にこの warning が大量に出る。 finalize.c の ↓か。 if (!GC_is_marked(real_ptr)) { GC_MARKED_FOR_FINALIZATION(real_ptr); GC_MARK_FO(real_ptr, curr_fo -> fo_mark_proc…
GC がまともに動くようになった。(落ちなくなったの意)
-O3 などでコンパイルしたときに GC のテストが通らない理由を調べた。 解放してはいけないものを sweep しているというわけではなかった 最適化による未使用変数の削除 global 変数への NULL 代入をなかったことにされる などなど。 GC 側に問題があるわけ…
コメントでアドバイス頂いた中で、一番効果がありそうな 4byte align を試してみました。 当社比で 3倍 程速くなりました。素晴らしい。 続いて一時変数を使うなど小手先の手動最適化で 更に1.2倍くらい高速化。
自前 GC の実装中で悩み中。 以前作ったモノはあまりに遅かったので捨てて書き直したんだけど、やっぱり heap の mark が遅い。 前回の経験を踏まえて 文字列など、ポインタを領域中に絶対含まない場合は alloc 時に指定し走査の対象とならない という工夫を…
初期化コードを Gauche で生成するようにしたので、初期化順序の問題に頭を悩ませなくて良くなったのも束の間。 GC を含めてビルド → 実行すると異様に重い。 数十秒返ってこない double free で落ちる double free の問題は sweep をコメントアウトして後で…
C++ で書かれる Scheme 関数を Environment に登録する際に、コンストラクタを利用した initializer を使っているのですがこれが GC の初期化と相性がよろしくない。 ↓ initializer void initialize##ClassName() \ { \ if (!g_gc_initialized) \ { \ scheme…
GCなし、Boehm GC、自前GC のビルドを簡単に切り分けられる仕組みをいれた。 自前 GC だけ double free な例外が!。
続いてはレジスタからの参照をチェックする。 いわゆる汎用レジスタとかそのあたりから参照されている部分も回収してはいけない。インラインアセンブラで全レジスタを取り出したりとか、pusha とかでスタックに全部のっけてしまう方法もありだけど。 setjmp …
Hoge* hoge = new Hoge; hoge->hige = new Hige; hoge がどこからか参照されていて mark されるならば、同じくヒープ上にある hoge->hige も mark されないとまずいという話。 これは new で割り当ての際に size を保持しておいて、そのサイズ分領域を走査し…
大域変数から参照されているものは回収されてはならない。 まだ参照されているか?は、bss領域とかデータ領域の開始位置と終了位置の間を走査してやればよい。 開始や終了の位置はリンク時に解決されるので、ld のデフォルトリンカスクリプトを見ればわかり…
GCのテスト実装にとりかかる。 とりあえず Mark & Sweep でいくことに。レジスタ/スタック/ヒープ/グローバル変数 など走査すべき場所や考慮すべき事象はたくさんあるので、段階的にまずは単純にスタックから。 流れとしては operator new を定義し、割り当…
GCに関してWebの資料やら、「情報処理学会誌94年11月号」を読み漁っていて大分詳しくなりました。 適当なメモは→Scheme/B.GC調査/02.GC概要 - Mona PJ Wikiに書いてあります。 ひとつまだ分からないことがあって迷っています。 GCを持たないAという言語で、G…
GCの資料を何となく集めています。 http://b.hatena.ne.jp/higepon/gc/ 情報処理学会誌94年11月号にGCの特集があり,詳しい解説が読める。 らしい、どこかでゲットしたいところだ。