ruby-trunk-changes r46182 - r46212

今日もテストの Thread や Tempfile、fd の leak 修正や、それと関連して標準添付ライブラリでの Thread や File の回収漏れの修正などがありました。

akr: r46182 2014-05-28 00:14:59 +0900

標準添付ライブラリ net/ftp で Net::FTP#transfercmd が例外で割り込まれた時に socket の close が行われていなかったのを修正しています。 これもテストの fd leak チェックの産物でしょうね。

svn: r46183 2014-05-28 00:15:14 +0900

version.h の日付更新。

akr: r46184 2014-05-28 00:15:54 +0900

rexml のテストでブロックパラメータがローカル変数と同名のため警告が出ていたのを回避するためブロックパラメータを改名しています。

akr: r46189 2014-05-28 00:49:13 +0900

標準添付ライブラリ cgiCGI::QueryExtension#read_multipart で Tempfile を閉じる時に close! で閉じるようにしています。 #close(true) は close! と同じなので、実質ここは変更なしですね。
またいくつかのテストで Tempfile#unlink を呼んでいたところは close! に置き換えてファイルを閉じるようにしています。

akr: r46191 2014-05-28 01:03:35 +0900

標準添付ライブラリ tempfile の Tempfile#inspect で close 済みのファイルは (closed) という文字列を含めるようにしています。

akr: r46193 2014-05-28 01:17:13 +0900

cgi のテストでも Tempfile#close(true) を #close! に置き換えています(処理内容は一緒)。

normal: r46194 2014-05-28 09:53:11 +0900

Signal.trap でハンドラ部分に :IGNORE を渡して SIG_IGN を設定しようとした場合、その直前に対象のシグナルを受信してシグナル通知用の queue にイベントが登録されていたら、取り出した時に SignalException が発生してしまうのを修正しています。ruby では Signal.trap で登録されたシグナルのハンドラはメインスレッドで実行するように、sigaction(3) などの C level のシグナルハンドラは queue にイベントを詰めて、メインスレッドがブロック処理時やタイマー切り替え時に処理するようになっていて、SIG_IGN を設定する前にイベントハンドラが登録されていると、それを実行するためのイベントが queue に入っている可能性があり、それを pop すると SignalException が発生してしまうので、IGNORE に設定されている時はそのイベントを無視するようにしています。 [ruby-core:62565] [Bug #9835]

normal: r46195 2014-05-28 10:48:11 +0900

r45913 で rb_thread_t の内部的な管理構造を st_table から doubly linked list にしたので、全スレッドに対する処理を行う関数がコールバックを受けとる方法で書かれているのを list_for_each() マクロを利用してその場でループっぽく書けるようになったのでリファクタリングしています。 [ruby-core:62745]

nobu: r46196 2014-05-28 12:05:48 +0900

昨日の r46159 で書き換えた Timeout のテストですが、元々は [Bug #1402] のチケットの確認で入れられたスレッドのタイマー切り替えのテストだったものが変化してしまっていたものなので、元の nil while flag がスレッド切り替えを起こすことを確認するテスト(タイムアウトが発生しない)は test/ruby/test_thread.rb に test_switch_while_busy_loop として移動して、タイムアウトが発生するテスト(busy loop に割り込めることの確認)は参照する ML 番号を削除して残しています。 [Bug #1402] [Bug #8523]

nobu: r46198 2014-05-28 13:20:31 +0900

envutil.rb の assert_separately で子プロセスで発生した例外のバックトレースに assert_separately 自体の呼び出しのバックトレースも追加するようにしています。

nobu: r46199 2014-05-28 13:20:35 +0900

test/ruby/test_dir_m17n.rb のユーティリティメソッド create_and_check_raw_file_name を assert_raw_file_name と改名しています。

nobu: r46202 2014-05-28 13:27:45 +0900

localinit.c ってなんだっけ…。というのはともかく、Mac OS X での filesystem encoding を決定する時に default external encoding が US-ASCII だった時に強制的に UTF-8 をセットするようにしています。

zzak: r46203 2014-05-28 13:34:22 +0900

r46065 の ChangeLog エントリの typo を修正しています。

nobu: r46204 2014-05-28 14:11:05 +0900

r46172 で UDPSocket のテストで Socket.getifaddr でローカルのインタフェースを検出するようにしたので、addr でアドレスの取得できないインタフェースがあった時にそれを無視するようにしています。

nobu: r46205 2014-05-28 14:39:45 +0900

未初期化の変数の警告抑制のための VAR_INITIALIZED() の定義で gcc 4.7 と 4.8 の時の警告対策を gcc 4.6 の時にも行うようにしています。

nobu: r46206 2014-05-28 15:05:43 +0900

rake のテストで Thread の後始末をするようにしています。

nobu: r46207 2014-05-28 15:22:09 +0900

rake のテストでさらに Thread の後始末を追加しています。

nobu: r46208 2014-05-28 17:03:55 +0900

drb のテストで終了時に DRb::DRbServer のスレッドを停止するようにしています。

akr: r46209 2014-05-28 18:09:26 +0900

拡張ライブラリ openssl の OpenSSL::SSL::SSLSocket#close で ssl の初期化が完了する前に呼ばれると close 処理がされないことがあった不具合を修正しているようです。

akr: r46210 2014-05-28 19:02:54 +0900

標準添付ライブラリ net/imap で Net::IMAP の初期化時に例外が発生すると開いた Socket が閉じられないまま残っていたのを修正しています。これもテストでの fd leak 検出の産物でしょう。

akr: r46211 2014-05-28 20:17:48 +0900

Net::IMAP のテストで Thread の後始末のために Thread#kill で Thread を停止していたのですが、これは不要とのことで消しています。 Thread#kill してしまうと、この Thread 内での socket の close が確実に行われなくなってしまうためだと思います。

akr: r46212 2014-05-28 23:06:28 +0900

test/ruby/test_io.rb の File オブジェクトが GC で回収される時に flush されることを確認するテストで GC.start で GC を起動して開いているファイルオブジェクトの回収を促してから削除するようにしていますが、保守的 GC のため必ず回収されるとも限らないので、ObjectSpace.each_object で File オブジェクトを探して対象のものは明示的に close を呼ぶようにしています。