ruby-trunk-changes r43380 - r43390

今日は finalizer の実行が詰まって T_ZOMBIE のオブジェクトが残ってしまってメモリを大量に使ってしまう不具合の修正や、メモリ管理の構造の変更(の下準備)などがありました。

nobu:r43380 2013-10-22 02:06:31 +0900

昨日の r43377 および r43379 で File.exists? や FileTest.exists? で deprecated の警告メッセージを出すようにしたのに追加して Dir.exists? も警告メッセージを出すようにしています。 [ruby-core:57953] [Bug #9041]

nobu:r43381 2013-10-22 11:03:49 +0900

r43372 で internal.h で定義したマクロ rb_syserr_fail_path() の呼び出す関数名の typo を修正しています。

nobu:r43382 2013-10-22 12:11:20 +0900

configure で環境変数 CFLAGS と LDFLAGS にフラグが渡されていた時にそれが利用可能なものかまずチェックするようにしています。

ko1:r43383 2013-10-22 15:24:54 +0900

finalizer の処理を rb_postponed_job_register_one() で遅延させて実行していたのがマルチスレッドでの実行時に処理が実行されなくなることがあったらしく、T_ZOMBIE の状態のオブジェクトが残ってしまってメモリ使用量が爆発するという現象が発生していたのを修正しています。またマルチスレッドでこの配列のカウンタを ATOMIC_CAS() で操作していたのですが、競合がおきた時のリトライがされていなかった? などの不具合を修正しているようです。おそらくこれで @tagomoris さんが調査して下さってた 2.1 でのメモリ使用量が突如増加する問題にも何らかの進展があるのではないでしょうか。

nobu:r43384 2013-10-22 15:58:05 +0900

r43383 の ChangeLog エントリの行末の空白除去。

nobu:r43385 2013-10-22 15:59:54 +0900

Dir.glob でビットフラグに File::FNM_DOTMATCH が渡されていたらカレントディレクトリ(".")にもマッチするように修正しています。 [ruby-core:53108] [Bug #8006]

eregon:r43386 2013-10-22 16:59:23 +0900

File.expand_path の rdoc 用コメントのサンプルコードを追加して、シンプルな使いかたと、上位のディレクトリに遡る方法もスクリプトファイルからの相対パスでファイルを指定するなど実践的なサンプルに変更しています。 [ruby-core:57734] [Bug #9002]

akr:r43387 2013-10-22 18:29:53 +0900

標準添付ライブラリ pp で Object#inspect が RVALUE のアドレスを16進数表記する時の桁数を元にフォーマットのしかたを変更していたところが、Object#inspect は snprintf(3) の "%p" 指示子による表示をしていて、アドレスによって桁数が可変なのでうまく一致しないためにテストが失敗することがあったらしく、PP#object_address_group で to_s メソッドを呼び出してその結果から切り出すようにしています。 Kernel#inspect を instance_method を使って取り出してそれを bind して呼び出していますが、このへんは to_s が再定義されていた場合を考慮してのことだと思われます。

ko1:r43388 2013-10-22 19:28:31 +0900

CRuby のオブジェクトのメモリ管理の構造はおおざっぱに heap -> page -> slot (struct RVALUE) という階層構造になっていて、オブジェクト1つが配置される slot の配列状の領域がいくつかリスト(やソート済みのインデックスなどで)で管理されている heap がプロセス全体で(ObjectSpace で)1つ存在するという実装でしたが、構造体のレイアウトを少し変更して、heap を複数に分けて持つことができるようにしています。 rb_heap_t という構造体を struct heap から分離して、現在のところは eden_heap というメンバ名で唯一の heap を持つようにしているので、実質はあまり変更はありませんが今後これを増やすことができるように準備しているという感じです。
Twitter でささださんとまつもとさんがやりとりをしていましたが、将来的に GC で回収されにくい長寿な(という傾向があると判っている、Symbolなど)をある heap にまとめて置いて、そこは RGenGC の minor GC では回収しないことにするなどで sweep のコストを低減しようということのようです。 https://twitter.com/_ko1/status/392642087234977794

ko1:r43389 2013-10-22 19:54:44 +0900

gc.c の heap_pages_init() の内容をその唯一の呼び元である Init_heap() に展開するリファクタリング

shyouhei:r43390 2013-10-22 21:59:27 +0900

internal.h で文末の ";" が2重になっていたのを修正、method.h で enum の最後の要素に数値の指定つきの要素を置く END_OF_ENUMERATION() というのを定義するかどうかの条件に __STRICT_ANSI__ が定義されているかのチェックを追加(strict ansi では一部だけ値を指定するのが NG なのではないかと)、vm_core.h で enum の最後の要素のあとに "," があったのを修正など、厳格なコンパイラでもコンパイルできるように修正しています。