ruby-trunk-changes r50009 - r50026

今日は GC 関連のチェック強化やリファクタリングが主に行なわれました。

ko1: r50009 2015-03-19 03:02:13 +0900

RGenGC の用語を整理して変数名や関数名などを改名しています。 long_lived -> uncollectible、remembered_wb_unprotected_objects -> uncollectible_wb_unprotected_objects と改名。 long lived というと結果的に長生きしたという感じになりますが、実際は「これから次の Major GC までは sweep してはいけない」という意味なので、とのこと。

svn: r50010 2015-03-19 03:02:29 +0900

version.h の日付更新。

ko1: r50011 2015-03-19 03:46:10 +0900

GC に関する一貫性チェックの check_rvalue_consistency() のリファクタリングとチェックの追加。オブジェクトの flags による age と bitmap で管理している remember set のつじつまがあっているかのチェックを追加しています。また RVALUE_MARKED() で bitmap で管理しているほうの remember set のビットをクリアするようにしています。 remember set に入るのは old object だけとしています。実際には uncollectible WB-unprotected なオブジェクトなので Minor GC でも mark されるので影響はないはずとのこと。

ko1: r50012 2015-03-19 04:47:36 +0900

Enumerable#sort_by で内部的に利用している構造体への値の代入に WriteBarrier を追加しています。 T_IMEMO オブジェクトからの参照として扱われるのでこういうのも WriteBarrier が必要なんですね。

ko1: r50013 2015-03-19 04:54:14 +0900

RGENGC_OLD_NEWOBJ_CHECK というマクロを導入してこれを 1 以上にしたら newobj_of() でときどき old object として新しいオブジェクトを返すというデバッグ用の処理を入れています。NEWOBJ() した直後の操作の Write Barrier 漏れなどを検出するためだと思います。なるほどー failmalloc (メモリ確保のエラーチェック不足を検出するためにたまに malloc を失敗させるライブラリ)みたいなもんですね。

ko1: r50014 2015-03-19 04:57:53 +0900

IMEMO_DEBUG というマクロを導入してこれが真の時は T_IMEMO 型オブジェクトを確保する時にそのファイル名/行番号をダンプするようにしています。 またデバッグ用関数 obj_info() で T_IMEMO 型オブジェクトの種類を表示するようにしています。IMEMO の出所不明なオブジェクトがみつかるバグでもあったのでしょうか。

ko1: r50015 2015-03-19 05:31:50 +0900

iseq_mark で iseq->orig があった場合は重複しているので不要な mark 処理をスキップするように最適化しています。 また rb_iseq_clone() で MEMCPY() でコピーした時の iseq->klass のぶんの WriteBarrier を追加しています。 一括でコピーした時の WriteBarrier 忘れやすそうですね。

ko1: r50016 2015-03-19 06:30:23 +0900

r50009 で long_lived を uncollectible と改名した時の ObjectSpace.dump のテストの追随漏れを修正。

ko1: r50017 2015-03-19 06:31:55 +0900

rb_obj_clone() でオブジェクトの複製した時に rb_obj_alloc() から返ってきたオブジェクトの struct RBasic::flags の FL_PROMOTED0, FL_PROMOTED1 の age 用フラグも保存するようにしています。 普通は 0 のはずですが r50013 でデバッグ用にあらかじめ old なオブジェクトが返されることができたのでそれを消さないため。

nobu: r50018 2015-03-19 09:09:13 +0900

common.mk の verconf.h の生成ルールで tool/generic_erb.rb の実行に $(MINIRUBY) ではなく $(BOOTSTRAPRUBY) を利用するように変更しています。組み込みの定数を使わないので BASERUBY を使ってもかまわなかったとのこと。

nobu: r50019 2015-03-19 10:31:03 +0900

r49593 で拡張ライブラリ securerandom から random.c に一部機能を取り込んだ時に追加した fill_random_bytes() の Windows 版実装で static 変数じゃないほうのローカル変数を rb_gc_register_mark_object() で GC の mark 処理の root として登録してしまっていたのを修正しています。

nobu: r50020 2015-03-19 11:04:31 +0900

Makefile.in で CONFIGURE 変数を取り込むようにして make configure で autoconf で生成する configure ファイル名を変更可能なようにしています。

nobu: r50021 2015-03-19 11:37:59 +0900

Windows 版で File::Stat の mode で取得できるパーミッション情報を変換する fileattr_to_unixmode() で group/others の write 権限をなくして wstati64() で明示的にフラグを落としていたのをやめています。

nobu: r50022 2015-03-19 11:38:02 +0900

Windows 版でファイルの権限情報を Unix 流の mode に変換する fileattr_to_unixmode() で FILE_ATRIBUTE_REPARSE_POINT というのを S_IFLNK に変換しています。 S_IFLNK はシンボリックリンクで REPARSE_POINT というのは NTFS の機能で別のドライブをマウントするみたいなことができる機能のことみたいです。REPARSE POINT を利用して Windows 上のシンボリックリンクを実現しているためシンボリックリンク相当に変換しているみたいですね。

ko1: r50023 2015-03-19 16:10:58 +0900

rb_copy_wb_protected_attribute() でオブジェクトをコピーする際に WB-unprotected なオブジェクトは RVALUE_DEMOTE() を読んで age=0 にリセットするようにしています。 WB-unprotected なオブジェクトは歳を取らないようにしたので一貫性が取れるようにしているのだと思います。

ko1: r50024 2015-03-19 16:14:12 +0900

newobj_of() で RGENGC_OLD_NEWOBJ_CHECK が 1以上のときに old object を返すことがあるようにしているところで is_incremental_marking() で incremental mark 処理中は old object を返さないようにしています。

ko1: r50025 2015-03-19 16:16:27 +0900

obj_info() で GC_DEBUG が真の時にファイル名/行番号を表示させるようにしています。

ko1: r50026 2015-03-19 16:19:52 +0900

gc.c の gc_verify_internal_consistency() を他のソースからも呼べるように公開した rb_gc_verify_internal_consistency() という wrapper 関数を導入しています。これもデバッグ用ですかね。