ruby-trunk-changes r43991 - r44020

今日は ruby developers meeting があったからかたくさんコミットがありました。 finalizer 処理の不具合修正、 GC 関係の情報取得 API の追加/変更、TracePoint の仕様変更などがありました。

tmm1:r43991 2013-12-05 09:19:13 +0900

GC のチューニング用の環境変数の取り込みを行なう ruby_gc_set_params() の呼び出しを起動時のより速い時点に移動して、起動処理中の GC にも反映されるようにしています。また rb_set_safe_level() よりも前に呼ばれることになるので引数で safe_level を渡すように引数を追加しています。

svn:r43992 2013-12-05 09:19:19 +0900

version.h の日付更新。

nobu:r43993 2013-12-05 10:16:20 +0900

r43991 の変更で ruby_gc_set_params() の alias である rb_gc_set_params() も引数を追加してしまっていたので、互換性のために無引数のままにするようにしています。

nobu:r43994 2013-12-05 10:47:12 +0900

finalizer の実行時に heap_pages_deferred_final を 0 にクリアするのを ATOMIC_PTR_EXCHANGE() を利用して atomic に行なうようにしています。また処理中に新たに実行すべき finalizer 処理が登録されたらそれも実行してから抜けるようにしています。 どういうシナリオなのかはっきりわかっていませんが LazySweep の影響で finalizer 実行中に新たに finalizer が積まれる場合があるみたいです。 [ruby-core:58833] [Bug #9205]

nobu:r43995 2013-12-05 10:47:58 +0900

ruby_atomic.h で ATOMIC_SIZE_CAS() の定義が ATOMIC_CAS() と同一だったので削除して使いまわすようにしています。元々 ATOMIC_SIZE_CAS() が未定義だったら ATOMIC_CAS() の別名として #define していたので定義が不要でした。

nobu:r43996 2013-12-05 10:48:10 +0900

ruby_atomic.h で今度は逆に ATOMIC_PTR_EXCHANGE() を ATOMIC_SIZE_EXCHANGE() として定義するようにして、GCC のビルトイン関数が使える環境では別途 __atomic_exchange_n() や __sync_lock_test_and_set() を使って定義するようにしています。

tmm1:r43997 2013-12-05 13:26:04 +0900

TracePoint の internal event INTERNAL_EVENT_GC_END を廃止して RUBY_INTERNAL_EVENT_GC_END_MARK と RUBY_INTERNAL_EVENT_GC_END_SWEEP を追加しています。 これまでの RUBY_INTERNAL_EVENT_GC_END のタイミングのイベントは RUBY_INTERNAL_EVENT_GC_END_SWEEP になり、新たにマーク処理の終了時のフックとして RUBY_INTERNAL_EVENT_GC_END_MARK を追加したということのようです。
また NEWS ファイルから ObjectSpace.after_gc_start_hook= と ObjectSpace.after_gc_end_hook= の記述は削除しています。これらはサンプルとして追加しているので消されるかもしれないとこのと。実際 ObjectSpace.after_gc_end_hook= は削除して います。

ko1:r43998 2013-12-05 13:54:20 +0900

malloc_usable_size() や malloc_size() など確保したメモリ領域のサイズを取得する関数のラッパーとして vm_malloc_size() という API を追加しています。

nobu:r43999 2013-12-05 14:26:25 +0900

rb_catch_obj() で rb_catch_protect() に渡す関数ポインタにコンパイル時の警告除去のための明示的キャストを追加しています。

nobu:r44000 2013-12-05 14:35:34 +0900

r43994 で追加した finalizer 実行中の finalizer 処理追加のテストで繰り返し実行する回数を 100 から 2 に減らしています。再現性が低いから繰り返していたのだと思いますが遅すぎたんでしょうか。

nobu:r44001 2013-12-05 14:38:13 +0900

再帰的構造をもつオブジェクトの hash のテストを test/ruby/test_hash.rb に移動してまとめています。

nobu:r44002 2013-12-05 14:38:15 +0900

さらに Hash と Array で再帰的な構造をもったオブジェクトの Hash のキーとして同値に扱われることを確認するテストを rubyspec から移植してきています。

nobu:r44003 2013-12-05 14:40:43 +0900

r43981 の rb_hash_recursive() 追加と再帰構造をもつオブジェクトの hash 値がどのオブジェクトからでも同じになるようにする変更を revert して再帰を検出したら根っこまで戻すようにしています。やっぱり困難だったみたいですね。

nobu:r44004 2013-12-05 15:56:05 +0900

r43998 の malloc_size(3) を利用するようにする変更の ChangeLog エントリで BSD で使えるというようなことが書かれていたのを削除して可能なら使うという表現にしています。 Mac OS X では使えるのと、そこの man には BSD の関数だと書かれているのですが、FreeBSD では使えないそうで、どうも本当に BSD 由来なのかアヤしいみたいです。まあいずれにせよ使えたら使うということで。

tmm1:r44005 2013-12-05 16:45:13 +0900

GC.stat の C API である rb_gc_stat() を公開 API に追加しています。これどこかで議論してのかなぁ。 ML にはちょっとみあたらない。このへんはささださんが OK って言ってれば OK なんじゃないかと思いますが。
また GC.stat に取得したい項目のキーの Symbol を引数に渡すことでその値だけ返す機能と結果を格納する Hash を引数で渡す機能も追加しています。

ko1:r44006 2013-12-05 17:52:30 +0900

メモリ管理用の関数 vm_malloc_XXX() や vm_xfree() などの関数名を objspace_malloc_XXX() や objspace_xfree() のように objspace_ の prefix に改名しています。

tmm1:r44007 2013-12-05 18:24:02 +0900

ObjectSpace.after_gc_start_hook= を削除しています。 サンプルの為に追加したので消すよーと先のコミットに書いてあったとおりに削除したみたいです。テストで使っていたので実装はそのままテスト用拡張ライブラリに移植されています。

tmm1:r44008 2013-12-05 19:30:38 +0900

GC.latest_gc_info というメソッドを追加して最新の GC の情報を取得できるようにしています。 r43893 で GC.stat に項目として追加した :last_collection_flags をやめて独立したメソッドで取得するようにしています。

duerst:r44009 2013-12-05 19:35:50 +0900

st.c のサイズ拡張時の次のサイズ決定のところのコメントを修正しています。

a_matsuda:r44010 2013-12-05 20:32:26 +0900

lib/webrick/httpresponse.rb の rdoc 用コメントの typo 修正。 resopnse -> response

nobu:r44011 2013-12-05 20:57:32 +0900

finalizer 処理中の finalizer 処理追加のテストでタイムアウトが足りなかったので延ばしています。

ko1:r44012 2013-12-05 21:06:59 +0900

r44008 で SET() というマクロの引数内で #if ... #endif を使っていてこれが VS2012 でコンパイルできないそうなのでまず変数に格納しておいて SET() に渡すように修正しています。

tmm1:r44013 2013-12-05 21:34:39 +0900

GC.garbage_collect の rdoc 用コメントの typo 修正。

nobu:r44014 2013-12-05 21:49:07 +0900

gc.c の行末の空白除去。

nobu:r44015 2013-12-05 21:53:31 +0900

Array#| の処理で左辺(レシーバ)の要素を優先して同値と判定された時はレシーバの要素が含まれるようにしています。同値なのでほぼどちらでも同じようなものですが同一性(object_id が一致する)で判定した時に左辺のオブジェクトが残ります、ということですね。

nobu:r44016 2013-12-05 21:59:09 +0900

make test の bootstraptest/test_thread.rb で例外メッセージのチェックで String#=~ に文字列を渡していたのを修正して Regexp#=~ を使うようにしています。

nobu:r44017 2013-12-05 22:02:48 +0900

tool/strip-rdoc.rb でファイルを binary mode で読み込むために最初に ARGF.binmode を呼び出すようにしています。

nobu:r44018 2013-12-05 22:05:04 +0900

String#scrub の公開 C-API rb_str_scrub() の rdoc 用コメントに第1引数の説明を追加しています。

nobu:r44019 2013-12-05 22:18:07 +0900

標準添付ライブラリ mkmf.rb で Windows 環境で DESTDIR を指定した時にドライブレターが重複してしまう不具合を修正しています。 これはおそらく 2.0.0-p247 の時からある不具合の修正ですね。 [ruby-core:58859] [ruby-core:58856] [Bug #9213]

nobu:r44020 2013-12-05 22:30:39 +0900

ObjectSpace.dump_all のテストで子プロセスの出力がなかった時にエラー出力を表示して skip するようにしています……と思ったのですが output が false/nil になることってあるんでしょうか。assert_in_out_err だと子プロセスの標準出力が空でも空配列が yield で渡されるような気がするのですが。
[追記]全く気がついてなかったのですがブロックパラメータのところが do |(output), (error)| ... end のように書かれていて、これにより配列が分解されて先頭の1要素のみパラメータには格納されています。そうかー、かっこで括るだけで分解できるんですね。っていうか |(a,)| みたいな書きかたはできないんですね、なんとなくこう書かないといけない気がしてたのですが。 |(a,_)| はできる。