ruby-trunk-changes r43504 - r43513

今日は gc.c のリファクタリングや WeakRef の不具合修正、Logger が複数プロセスでログファイルを共有している時のログローテート処理の修正などがありました。

nobu:r43504 2013-11-01 21:12:44 +0900

r43500 の rb_str_scrub を公開API にする時の変更で String#encode! で rb_str_scrub() が Qnil を返した時の考慮が抜けていて SEGV することがあったのを修正しています。

tarui:r43505 2013-11-01 21:49:49 +0900

gc.c の rb_objspace_t のメンバーのプロファイル用のものを profile メンバの中に移動するリファクタリング

tarui:r43506 2013-11-01 22:22:54 +0900

gc.c の make_deferred() で struct RBasic::flags に T_ZOMBIE をセットするのと、heap_pages_deferred_final のリストに繋ぐ処理を同時に行うようにしています。おそらくこれまでもひとつのオブジェクトは両方の処理を通っていたのでしょうが(Refactoring とあるので)、一ヶ所にまとめることで明確にしているのだと思います。

nobu:r43507 2013-11-01 22:46:29 +0900

test/ruby/test_m17n.rb の String#scrub のテストで expect の文字列にも u() を使って locale が UTF-8 でない環境を考慮するようにしています。

tarui:r43508 2013-11-01 22:47:39 +0900

gc.c のリファクタリング。 struct heap_page に before_sweep メンバを追加して page 毎に LazySweep の sweep 前の状態かどうかをこのメンバで管理するようにして、不要になった heap_is_before_sweep() is_before_sweep() などは削除しています。 page 数が増えた時に is_before_sweep() で毎回チェックすると遅くなるので高速化しています。

nobu:r43509 2013-11-01 23:24:34 +0900

WeakRef のテストで SEGV することがあった問題の追加修正です。 WeakMap の mark 関数で T_ZOMBIE のオブジェクトは mark しないようにしています。 [ruby-dev:47787] [Bug #9069]

tarui:r43510 2013-11-01 23:27:24 +0900

r43508 の ChangeLog エントリの文法を修正しています。

naruse:r43511 2013-11-02 07:14:42 +0900

標準添付ライブラリ logger.rb で複数プロセスで同一のログファイルに出力している時にログローテートに失敗するのを修正しています。ファイルの存在チェックをしてから open していたのが別のプロセスによって移動された瞬間だとチェック時は存在したけど open 時には存在しなくなっている可能性があるので、open してみて Errno::ENOENT を捕捉してファイルが存在しない時の処理に入るようにしています。また File#flock を使ってログローテートを排他処理するようにしています。 https://github.com/ruby/ruby/pull/428 [ruby-dev:47769] [Bug #9046]

svn:r43512 2013-11-02 07:15:01 +0900

version.h の日付更新。

nobu:r43513 2013-11-02 15:15:02 +0900

r43511 の Logger の修正を Windows でも動くように Windows 版の時は lock_shift_log を空の実装(yield するだけ)に変更しています。 Windows では誰かが開いているファイルを移動することはできないので、そもそも複数プロセスで共通のログファイルを開いている時にログロテートができないのだと思います。 [ruby-dev:47790] [Bug #9046]