ruby-trunk-changes r47347 - r47359

今日は make test-all のカバレッジを取れるようにする変更や、process.c のリファクタリングがありました。

hsbt: r47347 2014-09-02 16:59:18 +0900

環境変数 COVERAGE を設定している時に make test-all でのカバレッジを simplecov を利用して出力するようにしています。 simplecov は hsbt さんが fork したものを git clone して使うようにしているみたいです。このためまず make update-coverage しておかないといけないみたいです。依存関係をつけたほうがいいかも? 結果は coverage ディレクトリに HTML できれいに出力されます。便利。 [ruby-core:64681] [Feature #10189] https://github.com/ruby/ruby/pull/708
あと、ソースディレクトリとは別のところでビルドしていると、そのビルドディレクトリ以下のファイルのみ対象にしているみたいで .ext/common/openssl/*.rb の結果だけ出力されますね。

svn: r47348 2014-09-02 16:59:29 +0900

version.h の日付更新。

hsbt: r47349 2014-09-02 17:02:59 +0900

tool/rbinstall.rb での bundle gems (標準添付ライブラリではなく、gem パッケージを ruby の tar.bz2 などのパッケージに同梱するもの)のインストール時にエラーになるのを避けるため Gem.install に :local オプションと :ignore_dependencies オプションを追加しています。 [ruby-core:64702] [Bug #10192]

hsbt: r47350 2014-09-02 17:08:08 +0900

r47347 の test-all のカバレッジ取得の変更の ChangeLog エントリに GitHub の pull request への参照を追加しています。

akr: r47351 2014-09-02 20:47:35 +0900

process.c の retry_fork() から fork(2) の戻り値をチェックして errno によっては GC を実行したり sleep 入れたりしてリトライしている処理を handle_fork_error() という関数に切り出すリファクタリング

kou: r47352 2014-09-02 22:04:04 +0900

r47347 で導入された make update-coverage のコマンドの不要な cd コマンドを削っています。コメントをみると "never executed line" とあって、確かによくみるとその前の git コマンドが exec 付きになってるので、ここでシェル(多分)のプロセスが git のプロセスに変化してしまうのでその後が処理されないんですね。 なぜ exec がいるんだろう…

nobu: r47353 2014-09-02 22:32:59 +0900

IO#readpartial のテストで close した IO から読もうとしてたまに IOError が発生してエラーになってしまうのを、問題なしとして IOError 例外は無視させるようにしています。 r47178 でテストに調査用のダンプを追加していたところなので、発生している例外の情報をダンプした結果閉じた pipe から読むタイミングがあったということでしょう。 [ruby-core:64710] [Bug #10193]

akr: r47354 2014-09-02 22:45:20 +0900

r47302 で追加した IO.new にブロックを渡した時の警告のテストで、IO#fileno で file descriptor を渡す元の IO オブジェクト(pipe) の autoclose を false に設定して、fd 利用前に閉じられないようにしています。 Errno::EBADF の対策とのこと。 しかし autoclose は finalize 時に close されるかどうかの制御だと思うのですが、元になる IO はそれぞれローカル変数やブロックパラメータに格納されているので GC されないような気がするんですよね。はて…。

akr: r47355 2014-09-02 22:56:35 +0900

process.c の rb_fork_internal() という共通処理化されていた関数を呼び出し元に展開して削除しています。 括り出すんじゃなくて逆のリファクタリングは珍しいですね。結局大部分の処理が rb_fork_async_signal_safe() 用の処理だったので分離する意味があまりないということだったようです。

akr: r47356 2014-09-02 23:27:10 +0900

process.c の fork した子プロセスからエラーを pipe 経由で送受信する処理の関数 send_child_error() と recv_child_error() でコールバック関数が async-signal-safe かどうかのフラグを削除して、常に async-signal-safe であるものとして扱うようにして処理をシンプルにしています。

akr: r47357 2014-09-02 23:47:46 +0900

process.c の retry_fork() を retry_fork_async_signal_safe() と retry_fork_ruby() に分割して、こちらも引数で async-signal-safe かどうかの指定を渡していたのを関数ごと別の定義にするようにリファクタリングしています。 これは before_fork() と after_fork() の呼び出しの有無だけなので、分ける必要あるかなぁ、ちょっと微妙な気がしますね。

akr: r47358 2014-09-03 00:13:36 +0900

r47357 で retry_fork() から分割した retry_fork_async_signal_safe() でコールバック関数を渡せるようにして rb_fork_async_signal_safe() でやっていた子プロセスでの処理を retry_fork_async_signal_safe() に移動しています。 なるほどこうするための分割だったのか。となると retry_fork_async_signal_safe() を再利用するのかもしれませんね。

svn: r47359 2014-09-03 00:13:51 +0900

version.h の日付更新。