ruby-trunk-changes r43455 - r43467

今日はメソッドキャッシュと定数キャッシュの invalidation を同じカウンタで管理していたのをそれぞれ別に分ける変更や拡張ライブラリ readline の EditLine との組み合わせでの不具合修正、T_TYPEDDATA 型のオブジェクトで解放処理が遅延されていたのをそれが必要なクラスのみに限るようにする変更などがありました。

charliesome:r43455 2013-10-29 09:52:38 +0900

グローバルなメソッドキャッシュや定数のキャッシュの invalidation に使っている VM の version カウンタをこれまでは共用していたのをメソッドキャッシュ用と定数キャッシュ用に別々のカウンタを使うようにしています。これによりメソッドの定義で定数のキャッシュが無効化されたり、定数の定義でメソッドキャッシュがクリアされるのを抑制するようにしています。

svn:r43456 2013-10-29 09:52:44 +0900

version.h の日付更新。

tmm1:r43457 2013-10-29 11:11:26 +0900

GC::Profiler.total_time が返す値が 1 少なく設定されていたのを修正しています。

akr:r43458 2013-10-29 12:09:00 +0900

拡張ライブラリ readline で rl_getc_function にセットしている readline_getc() に EditLine の場合は NULL が渡されることがあるのでその時は stdin を利用するようにしています。

kazu:r43459 2013-10-29 14:31:57 +0900

r43395, r43421, r43439 の ChangeLog エントリの typo 修正。

nobu:r43460 2013-10-29 15:46:33 +0900

ruby_atomic.h に size_t の CAS (Compare And Swap) を行うマクロ ATOMIC_SIZE_CAS() を追加しています。

ko1:r43461 2013-10-29 16:25:45 +0900

未使用の page をまとめておく Tomb heap から page を再利用するために取ってくる heap_page_resurrect() で freelist が NULL のページをスキップしていたのを、無視して常に先頭の page を取ってくるように修正しています。

ko1:r43462 2013-10-29 16:49:43 +0900

vm_malloc_increase() で malloc_increase を減算するのに malloc_increase を参照してアンダーフローしないかチェックしてから ATOMIC_SIZE_SUB() を利用したり単に 0 を代入したりしていたのを、事前に減算後の結果を計算しておいて ATOMIC_SIZE_CAS() でその値をセットする(競合したらリトライする)ようにしてマルチスレッドでの利用時により安全に malloc_increase を操作するようにしています。

ko1:r43463 2013-10-29 18:42:45 +0900

T_TYPEDDATA 型のフラグに RUBY_TYPED_FREE_IMMEDIATELY というフラグを追加して、T_DATA 型のオブジェクトの解放は遅延するようにしているのを、すぐに解放するように指定できるようにしています。確かこれは finalizer から別の解放済みオブジェクトを参照してしまうケースを救済するために即座にメモリ解放せずに遅延させるようにしてたのだったと思いますが……と思ったらちょっと違いました。 r43466 を参照。メモリ使用量の抑制との兼ねあいで不要ならすぐに解放できるようにしようということでしょうか。
またついでに free 関数ポインタのデフォルトの xfree 関数を利用する値のマクロ RUBY_DEFAULT_FREE を参照するようにするリファクタリングもあります。

ko1:r43464 2013-10-29 18:47:06 +0900

TracePoint の free 関数に何も処理しない自前の tp_free() 関数を登録していたのを RUBY_TYPED_NEVER_FREE という解放処理をしないことを指定するマクロを利用するようにするリファクタリング

ko1:r43465 2013-10-29 19:49:45 +0900

r43463 で追加したフラグ用のマクロの typo を FL_WB_PROTECT -> FL_WB_PROTECTED と修正。

ko1:r43466 2013-10-29 20:16:54 +0900

r43463 で導入した T_TYPEDATA の RUBY_TYPED_FREE_IMMEDIATELY フラグをさっそく利用するようにしています。 さっき記憶で書いたの解放処理を遅らせている原因は [ruby-dev:35578] からのスレッドにあって、少し記憶が違っていて free 関数の処理から Ruby の GVL を解放するような処理が走ると GC 中に動いてはいけない処理が動いてしまうという問題を回避するためでした。 GC 中に実行しても問題ない処理しか呼ばない free 関数を登録する T_TYPEDDATA 型のオブジェクトは RUBY_TYPED_FREE_IMMEDIATELY フラグをセットして GC 中に即座に解放処理も実行するようにしています。

glass:r43467 2013-10-29 22:14:19 +0900

Array#uniq! の実装で Hash に変換してから配列に詰め直しているところを for ループで書いていたのを st_foreach() を使うように書きかえています。 for ループを st_foreach() に変更したというより、これまで元の配列の要素でループしてそれが Hash に残っているかを判定して残ってたら格納するというように uniq! で短くなっても元の配列サイズぶんループしてて無駄だったのを削っているということみたいです。同じ回数なら st_foreach() で関数呼び出しのオーバヘッドがかかるぶん for ループのほうが有利そうですしね。