ruby-trunk-changes r44632 - r44643

今日は標準添付ライブラリ open-uri の proxy オプションの処理の不具合修正、resolv の修正、その他 socket での IO のシステムコールの呼び方の最適化などがありました。

nobu: r44632 2014-01-18 11:38:40 +0900

時々 RingServer のテストが rubyci で止まってしまうので、テストメソッドの先頭で Thread.abort_on_exception = true してバックグラウンドの Thread が例外かなにかで死んだらメインスレッドにも伝播させるようにしています。

svn: r44633 2014-01-18 11:38:45 +0900

version.h の日付更新。

nobu: r44634 2014-01-18 14:47:38 +0900

st.c でハッシュ値から st_table::bins の配列のインデックスを計算する処理(っていっても mod 取るだけですけど)を hash_pot() というマクロに切り出すリファクタリング

nobu: r44635 2014-01-18 15:56:30 +0900

localeinit.c で Windows 環境で使う codepage のためのバッファ長やエンコーディング処理を SIZEOF_CP_NAME および CP_FORMAT() というマクロに切り出すリファクタリング

nobu: r44636 2014-01-18 18:38:22 +0900

RingServer のテストで止まる現象の調査のためにタイムアウトと Thread.abort_on_exception = true を入れたのをメソッドに切り出して、テストメソッド test_do_reply_local にも同様の対処をするようにしています。こっちも固まることがあるみたいですね。

akr: r44637 2014-01-18 21:20:31 +0900

標準添付ライブラリ open-uri で open のオプションに proxy: nil を渡しても環境変数 http_proxy などによる Proxy の指定があるとその Proxy 経由の接続になってしまっていた不具合を修正しています。 [ruby-core:59650] [Bug #9385]

akr: r44638 2014-01-18 21:31:57 +0900

拡張ライブラリ socket でソケットオプションの IP_MULTICAST_LOOP と IP_MULTICAST_TTLNetBSD では 1byte なので条件コンパイルで変数の型を分けていましたが、OpenBSD でも同様だったそうなので条件に追加しています。 [ruby-core:59496] [Bug #9350]

akr: r44639 2014-01-18 21:44:36 +0900

拡張ライブラリ socket の Socket::Option.byte および Socket::Option#byte の rdoc コメントから「The size and endian is dependent on the platform.」という一文を削除しています。 1 byte 固定なので。

akr: r44640 2014-01-18 22:28:35 +0900

open に O_CLOEXEC フラグが利用可能かどうかのチェックを毎回していたのを最初の open(2) の時の結果を保持しておいてそれを利用するように最適化しています。 [ruby-core:59419] [Feature #9328]

akr: r44641 2014-01-18 22:42:39 +0900

io.c の open(2) 済みの fd の最大値を管理している rb_update_max_fd() で渡された fd が現在の max_file_descriptor より小さければチェックもする必要がないのですぐに返しています。fstat() による 有効な fd かのチェックをスキップするようにしています。

akr: r44642 2014-01-18 23:01:43 +0900

標準添付ライブラリ resolv で Resolv::DNS::Resource::TXT#data が最初の要素だけ返していたのを全要素の文字列を連結したものを返すようにしています。 参考URL: http://tools.ietf.org/html/rfc4408#section-3.1.3 [ruby-core:58220] [Bug #9093]

akr: r44643 2014-01-18 23:13:22 +0900

拡張ライブラリ socket で rsock_maybe_fd_writable() および rsock_maybe_wait_fd() という rb_thread_fd_writable()/rb_thread_wait_fd() の wrapper のマクロを導入し、Linux では実際には rb_thread_fd_writable() を呼ばないように定義することで不要な ppoll(2) や select(2) の呼び出しを抑制しています。 コメントによると(少なくとも) Linux ではいくつかのブロックするシステムコールでは利用可能になった時にカーネルが 1スレッドずつ起こすような挙動をするので一気に大量のスレッドが起床してパフォーマンス低下をひきおこすことはないので ppoll/select のチェックなしに呼んでもいい、ということだそうです。実際には Linux に限らず今時の *nix 系のカーネルなら同様なので次第に対象を増やすことができるはず、だそうです。 [ruby-core:57950] [Bug #9039]