ruby-trunk-changes r50900 - r50909

今日は Thread の終了時に main thread だけ残った時の割り込み処理の変更や、net/http の open_timeout の実装の変更などがありました。

kosaki: r50900 2015-06-15 07:52:01 +0900

VM のプロセス終了時に全ての Thread を停止させている時のために Thead の終了時に main thread だけが残っている状態になると main thread に割り込みをかけていたのですが、拡張ライブラリからはこの割り込みが VM 終了によるもの(従って処理をやめるべき)なのか、単に別の Thread が終了した通知なのか区別がつかなくてうまく処理できない(再度ブロックする処理を実行すると終了時にブロックする可能性がある)という問題を修正するため、Thread 終了時の割り込みに main_th->status をチェックするようにしています。 [ruby-dev:49044] [Bug #11237] https://github.com/ruby/ruby/pull/898

svn: r50901 2015-06-15 07:52:30 +0900

r50900 で新規追加されたファイルの svn property 設定。

nobu: r50902 2015-06-15 08:05:52 +0900

r50887 で追加した load 時の GVL 外しのテストで main thread が load で止まるまで sleep 0.1 で待ってましたが、確実に、また最小の待ち時間ですむように sleep 0.001 で main thread がブロックするまで待つようにしています。

nobu: r50903 2015-06-15 08:23:48 +0900

r50900 で追加されたテスト用の拡張ライブラリ ext/-test-/gvl/call_without_gvl/call_without_gvl.c で #include は不要だったので削除しています。 ruby/define.h で(存在すれば) #include 済みとのこと。

nobu: r50904 2015-06-15 08:40:51 +0900

r50890 で追加された拡張ライブラリ socket の parse_numeric_port() という関数を inet_pton(3) が利用可能な時だけ定義するように preprocessor の条件を追加しています。呼び出している所も同じ条件を持っているので、定義しているけど呼び出されていない static 関数の警告の除去のためみたいですね。

nobu: r50905 2015-06-15 10:51:49 +0900

テスト用ユーティリティ EnvUtil で子プロセスのエラーを表示する処理の Proc オブジェクト FailDesc で signal を受信した情報がある時だけ signal についての情報を表示するようにしています。

nobu: r50906 2015-06-15 10:52:00 +0900

EnvUtil#assert_separately で子プロセスの標準エラー出力や終了ステータスをチェックする assertion で FailDesc を使ってより詳細な情報を出力するようにしています。

naruse: r50907 2015-06-15 11:11:20 +0900

標準添付ライブラリ net/http の Net::HTTP#connect で :open_timeout の指定時に Socket#connect_nonblock と io/wait の IO#wait_readable や IO#wait_writable を利用してタイムアウト処理するようにしています。 wait_readable や wait_writable も使っているのは SSLSocket の時の shakehand 処理などで connect の時点で通信が行われることがあるからみたいです。 https://github.com/ruby/ruby/pull/899

knu: r50908 2015-06-15 14:37:38 +0900

標準添付ライブラリ set の Set#each と SortedSet#each にブロックを渡さずに呼び出した時に返す Enumerator を #size メソッドに対応するようにしています。 https://github.com/ruby/ruby/pull/931

nobu: r50909 2015-06-15 17:18:18 +0900

rb_mod_define_method() で body の型のチェックを使いまわして重複したチェック関数の呼び出しを省略しています。なのですが if 文の else 節が削られて Proc として処理するところにマージされているので、Module#define_method に Proc か Method 以外のオブジェクトを渡した時の例外メッセージが変化してしまうのではないかという気がします。