ruby-trunk-changes r45063 - r45084

今日は拡張ライブラリ socket の複数の不具合修正と Logger のログローテートの不具合修正、initialize_copy に self を渡した時の不具合修正のほか RB_GC_GUARD() の改善などがありました。

akr: r45063 2014-02-20 22:22:44 +0900

r45047 で getaddrinfo() の不具合回避のために追加した実装でメモリ確保を xmalloc + MEMZERO() でクリアしていたのを xcalloc() を使うことでシンプルにしています。 https://bugs.ruby-lang.org/issues/9525#note-14

normal: r45064 2014-02-21 08:45:55 +0900

コンパイラの最適化で VALUE の変数が消されて GC の mark 漏れが生じるのを防ぐための RB_GC_GUARD() の改善をしています。元となるチケットは Solaris での不具合の報告なので SolarisStudio での対応かと思いますが volatile なグローバル変数 rb_gc_guarded_val を導入して RB_GC_GUARD() が内部で使っている関数 rb_gc_guarded_ptr_val() (rb_gc_guarded_ptr() からこのコミットで改名)の中でこの変数にも値を代入するようにしています。コメントによるとこれによってコンパイラにこの値がシグナルハンドラからも利用される可能性があると思わせることで最適化を防ごうとしているとのこと。いやーコンパイラの最適化との終わりなき戦いですね。 [ruby-core:60816] [Bug #7805]

svn: r45065 2014-02-21 08:45:59 +0900

version.h の日付更新。

normal: r45066 2014-02-21 09:55:13 +0900

拡張ライブラリ socket の BasicSocket#sendmsg, BasicSocket#recvmsg でエラー時に再度書き込み/読み込み可能になるのをまってリトライする処理がなぜかエラーチェックの if 文の外に出てしまっていたため無限ループに陥っていたのを修正しています。 また豪快な不具合がありましたね…。ちなみに 1.9.3/2.0.0 も同様になっているので全バージョンバックポートが必要そうです。

hsbt: r45067 2014-02-21 10:53:38 +0900

monitor, resolv, rexml, rss のテストスクリプトから未使用の変数を削除する警告除去の修正。 Monitor のテストのぶんはむしろ明示的に th.join で終了を待ったほうがいいような気がします。

hsbt: r45068 2014-02-21 10:56:53 +0900

r45067 の ChangeLogtypo 修正。

nobu: r45070 2014-02-21 16:04:25 +0900

標準添付ライブラリ logger のテストスクリプト test/logger/test_logger.rb から内部的なクラス毎に test_application.rb、test_logdevice.rb、test_severity.rb にテストを切り出すリファクタリング

nobu: r45071 2014-02-21 16:11:03 +0900

標準添付ライブラリ logger の時間によるログローテートで、時間取得と実際の書き込みの間の僅かな瞬間に日付が変更した時など、必要なローテートがされない可能性があったので、ローテーションを行う期間の管理を @next_rotate_time というインスタンス変数に入れておいて抜けがおきないようにしています。 https://github.com/ruby/ruby/pull/539
r45070 の logger のテスト分離でテストは test_logdevice.rb に入っていますね(バックポート時の参考に)。

nobu: r45072 2014-02-21 16:45:55 +0900

r45071 の logger の修正でサマータイム(DST)を考慮して調整するようにしています。

nobu: r45073 2014-02-21 16:49:54 +0900

r45072 で追加したテスト(r45071 の続き)が Linux, Mac OS X, FreeBSD でのみ動くようにしています。 test/ruby/test_time_tz.rb から持ってきたとありますがタイムゾーンがサポートされているプラットフォームという意図だそうです。

nobu: r45076 2014-02-21 20:42:03 +0900

チケットは Kernel (モジュール)に initialize_copy で Kernel 自身を渡すと SEGV したという報告ですが、全般的に initialize_copy に自分自身が渡された時になにもしないようにするという対応が行なわれています。 [ruby-dev:47989] [Bug #9535]

naruse: r45081 2014-02-21 23:10:06 +0900

tool/redmine-backporter.rb というツールを追加しています。 ちらっとみたところ bugs.ruby-lang.org のチケットを閲覧、検索したり close したり Backport フィールドの操作をしたり、バックポート用コマンドのオプションを生成したりということを行うツールのようです。

shugo: r45084 2014-02-21 23:59:44 +0900

拡張ライブラリ socket で Socket#connect などで wait_connectable() で getsockopt(2) で取得したエラーが 0 だった時に書き込み可能であればループを抜けるようにしています。 FreeBSD で無限ループに陥ることがあったそうです。 ここでエラーを取得しようとしていたのは select/poll がエラー時に OUT のイベントのビットのみ立てて返すためだったみたいですが、Windows での WinSock の対応もからんでいるそうで、変更が積み重なっていくうちにおかしなことになっていたみたいですね。 [ruby-core:60940] [Bug #9547]