ruby-trunk-changes r45544 - r45554

今日は RGenGC まわりの mark 漏れの不具合修正、C level backtrace 取得時のメモリ初期化漏れの修正、Android 版のビルドエラー対応などがありました。

akr: r45544 2014-04-10 08:16:10 +0900

r45517 で Linux の時に signal.c の check_stack_overflow() の引数に sigaction(3) のコールバックで受け取れる ucontext_t* の引数を追加してそのスタックポインタの値で判定するようにしましたが、Android 版のビルド時に ucontext_t 型が利用できないのにこちらの定義を利用しようとしてしまってビルドできなかったそうで、defined(HAVE_UCONTEXT_H) を条件に追加しています。

svn: r45545 2014-04-10 08:16:14 +0900

version.h の日付更新。

nobu: r45546 2014-04-10 12:40:30 +0900

gc.c のインデント修正のみ。

nobu: r45547 2014-04-10 12:40:32 +0900

gc.c の gc_verify_internal_consistency() で RGenGC が有効でない時に #if ... #endif の範囲を変数の宣言やエラー処理のところまで広げて、空の関数として定義されるようにしています。

nobu: r45548 2014-04-10 12:40:34 +0900

gc.c の heap_page_allocate() でデバッグメッセージのフォーマット文字列に %p でポインタを埋め込むようになっていたのに引数に渡していなかったのを修正しています。 また rgengc_report() マクロの定義を関数マクロの可変長引数が利用可能ならそれを利用して定義するようにしています。

ko1: r45549 2014-04-10 14:41:41 +0900

gc.c の rb_gc_writebarrier_unprotect_promoted() で RGenGC のデバッグメッセージ出力が常に出ていたところ(level が 0 だった)を level =1 にして通常時に出さないようにしています。

naruse: r45550 2014-04-10 16:19:53 +0900

addr2line.c で C level backtrace 取得のため読みとったデバッグ情報を管理するリストのエントリの確保を malloc(3) でなく calloc(3) で確保してメモリ内容をクリアして使うようにしています。 また rb_dump_backtrace_with_lines() でベースアドレスの配列 base_addrs のメモリ領域を解放し忘れていたのを修正しています。

naruse: r45551 2014-04-10 16:39:44 +0900

Windows の拡張ライブラリロードのテスト用のスクリプト test/-ext-/win32/test_dln.rb で File クラスを使っているところが、実は test/-ext-/file/test_stat.rb に Bug::File クラスが定義されているせいでそちらを参照してしまっていたので ::File とトップレベルの定数を明示的にアクセスするように修正しています。

ko1: r45552 2014-04-10 19:01:16 +0900

RGenGC のチェック用の関数の位置を移動しているようです。また gc_marks_check() で checker_func が NULL の時に対応するようにしています。あと gc_verify_internal_consistency() で RGENGC_CHECK_MODE が 4以上の時にチェックで不整合がみつかったら rb_bug() で強制終了する前にオブジェクトの参照情報を全てダンプするようにしています。

ko1: r45553 2014-04-10 19:16:24 +0900

rb_ary_modify() で shared array を参照している配列が RGenGC の old に promote した時に shared array が young だったら参照している remember set に追加して shared array が Minor GC でマークされるようにしています。 Queue に push/pop を繰り返しているとマーク漏れで SEGV することがあったようです。 チケットをみるとQueue に lambda を push/pop して実行したりしていますけど、修正内容からすると多分 Array の出し入れあたりが問題で lambda と Queue は直接は関係ないのだろうと思います。 [ruby-core:61919] [Bug #9718]

ko1: r45554 2014-04-10 19:23:23 +0900

r45553 のテストの不要な assert を削除しています。