ruby-trunk-changes r43526 - r43540

今日は RGenGC の3世代化(デフォルトでは無効)や旧世代のメモリ使用量で major GC のトリガを引くようにするパラメータの追加など GC のメモリ使用量抑制の変更や、WeakRef でオブジェクトの生存判定の不具合の修正などがありました。

akr:r43526 2013-11-04 22:21:53 +0900

xmlrpc のテストで WEBrick を使ったサーバのポート番号を固定の番号を使っていて同時に実行できなかったので動的に使用するポートを割り当てるようにしています。

ko1:r43527 2013-11-05 00:04:10 +0900

RGenGC 用のオブジェクトのフラグ FL_OLDGEN を FL_PROMOTED に改名しています。この後に 3世代版の RGenGC の導入の変更があるので、それに向けてフラグの意味を少し変更するために先だって改名をしているのだと思います。

svn:r43528 2013-11-05 00:04:20 +0900

version.h の日付更新。

ko1:r43529 2013-11-05 00:06:14 +0900

r43527 のフラグの改名にあわせて node.h のコメントも修正しています。

ko1:r43530 2013-11-05 03:59:33 +0900

RGenGC に3世代の世代別GCを導入しています。ただしデフォルトでは無効で、RGENGC_THREEGEN を真に定義してコンパイルすると有効になるそうです。まだ不安定で再現性のないエラーやパフォーマンスの悪化があるそうなので、デバッグやメモリ使用量の評価に協力してくれる人は試してみてください、というステータスだそうです。 RGenGC には新世代(まだ GC を経験していない)と旧世代(1回以上GCを生き抜いた)の2世代だけだったのですが、短命なオブジェクトがたまたま利用中に GC が走ると旧世代に昇格してしまい、結果 major GC が実施されるまで回収されなくなってしまうために、極端なケースでは大量のメモリを消費してしまうというのに対処しようとしているそうです。これまでの FL_PROMOTED とは別に oldgen_bitmap を導入して、これで Infant(まだ一度も GC を経験していない)、Young(一度 GC を生き残った(FL_PROMOTED が立ってる)けど oldgen_bitmap には追加されていない)と Old (2回以上 GC を生き残った)にわけて、Infant と Young を minor GC の対象にすることで major GC でしか回収されなくなる閾値を引き上げるというのが主なアイデアのようです。

ko1:r43531 2013-11-05 04:04:06 +0900

r43119 で一度大きくした GC の実施を制御する閾値 GC_MALLOC_LIMIT_MAX を 512MB から 384MB に再度調整しています。 512MB is huge.

ko1:r43532 2013-11-05 13:51:01 +0900

拡張ライブラリ objspace で提供していた ObjectSpace.memsize_of の実装を gc.c に移動して Old の世代に昇格したオブジェクトの消費メモリを概算するプロファイラを追加しています。 memsize_of で完全に利用しているメモリ全てを報告しない場合もあるとか T_DATA 型のオブジェクトは memsize_of 用の関数に問題があることがあるなどで全ての使用メモリを正確に知ることができるわけではないそうですが、これで旧世代のオブジェクトのメモリ使用量がしきい値を越えたら Major GC を実施するようにすることで 3世代 RGenGC が対象としているテストケースの対策として別の案として入れているみたいです。しきい値を制御する環境変数の導入もそれらしいコードがありますがコメントアウトされています。

ko1:r43533 2013-11-05 13:52:10 +0900

r43530 の ChangeLog エントリの typo 修正。

nobu:r43534 2013-11-05 16:48:31 +0900

r53530 の変更の行末の空白除去。

nobu:r43535 2013-11-05 16:56:49 +0900

"clobbered by 'longjmp' or 'vfork'" の警告抑制のために rb_protect() で status の宣言に volatile を付加しています。 th->cfp のリセットの位置の変更も同様の理由でしょうか。

nobu:r43536 2013-11-05 16:56:51 +0900

r43522 で setjmp(3) の未定義の使用法を回避するために導入した ruby_threadptr_tag_jump() を rb_threadptr_tag_jump() に改名しています。他の rb_threadptr_ で始まる関数群にそろえているようです。

nobu:r43537 2013-11-05 17:10:32 +0900

標準添付ライブラリ Shell のテストで一時ディレクトリの削除処理を追加しています。

nobu:r43538 2013-11-05 17:10:34 +0900

拡張ライブラリ pty で seteuid() の戻り値を参照していないという警告除去のために戻り値をチェックしてエラーメッセージを返すようにしています。

tarui:r43539 2013-11-05 20:15:21 +0900

is_live_object() で struct RBasic::klass を 0 にして ObjectSpace から隠しているオブジェクトが死んだオブジェクトとして判定されていて WeakRef で不具合が出ていたのを修正しています。 [ruby-dev:47788] [Bug #9072]

akr:r43540 2013-11-05 21:25:15 +0900

シグナルハンドラ内での Thread#join の呼び出しテストを assert_separately を使って子プロセスで実施するようにしています。 Signal.trap で登録するシグナルハンドラがプロセスでグローバルな設定なので他のテストにも影響してしまうためだと思います。