ruby-trunk-changes r31416 - r31431

本日は Linux において select(2) を poll(2) で代替する変更に関連した一連のコミットと、定数 File::CLOEXEC の追加がありました。file descriptor をたくさん使っているようなケースで環境が Linux の場合はパフォーマンスが良くなるかもしれませんね。

kosaki:r31416 2011-05-04 07:37:07 +0900

rb_fd_copy() で memcpy() に誤ったポインタを渡していたのを修正しています。 [ruby-core:35982]

svn:r31417 2011-05-04 07:37:12 +0900

version.h の日付更新。

tenderlove:r31418 2011-05-04 08:06:19 +0900

Psych が Time をYAMLエンコードする際に、タイムゾーンのZの前に空白を入れるように変更しています。

kosaki:r31419 2011-05-04 09:59:57 +0900

select(2) を呼ぶ処理をまとめて関数を切り出しています。rb_wait_for_single_fd() という API が追加されています。ビットフラグ(RB_WAITFD_IN, RB_WAITFD_PRI, RB_WAITFD_OUT)とタイムアウトの指定つきで fd にイベントが発生するのを待ってくれます。rb_io_wait_readable/writable の上位種みたいな感じですね。 [ruby-core:35565] [Feature #4531]

kosaki:r31420 2011-05-04 10:07:03 +0900

そして poll(2) が select(2) のかわりに利用できる環境(Linux だけが条件を満たすとのこと)であれば select のかわりに poll(2) を利用するようにしています。[ruby-core:35565] [Feature #4531]

kosaki:r31421 2011-05-04 10:09:08 +0900

ext/io/wait/wait.c で wait_readable() という独自の関数を作っていたところを rb_wait_for_single_fd() を呼ぶように変更しています。[ruby-core:35565] [Feature #4531]

kosaki:r31422 2011-05-04 10:12:04 +0900

ext/socket/init.c でも rb_wait_for_single_fd() を利用するように変更しています。 [ruby-core:35565] [Feature #4531]

kosaki:r31423 2011-05-04 10:13:02 +0900

ext/readline/readline.c でも rb_wait_for_single_fd() を利用するように変更しています。 [ruby-core:35565] [Feature #4531]

kosaki:r31424 2011-05-04 11:44:28 +0900

ext/socket/init.c を再修正。select/poll は正常終了時に IN/OUT(READ/WRITE)両方のビットを立てて返し、エラー時に OUT(WRITE)のビットのみ立てて返すらしいので(ソケットの場合?)エラー判定を修正しています。これはややこしい!

kosaki:r31425 2011-05-04 11:54:34 +0900

HAVE_RB_FD_INIT による #ifdef はもう不要になったので削除しています。

kosaki:r31426 2011-05-04 12:47:33 +0900

fd が不正だと poll(2) が POLLNVAL を立てて返すのでそのチェックを追加しています。 [ruby-core:35991] [Feature #4531]

kosaki:r31428 2011-05-04 18:50:27 +0900

rb_wait_for_single_fd() をテストするための拡張ライブラリを使ったテストを追加しています。

kosaki:r31429 2011-05-04 19:02:06 +0900

poll(2) を利用した時に返すビットフラグの値を、例えば POLLHUP や POLLERR が立っている時も RB_WAITFD_IN を立てて返すというように RB_WAITFD_(IN|OUT|PRI) に適切にマッピングして返すようにしています。

kosaki:r31430 2011-05-04 20:29:24 +0900

定数 File::CLOEXEC を追加しています。1.9 には IO#close_on_exec= というメソッドもありますがこれは open の時に mode のビットフラグに使うための定数です。[ruby-core:22893] [Feature #1291]
ところでチケットをみてると Linux では fopen(3) の mode が "e" を受け付けるとあってほーと思いました。知りませんでした。

kosaki:r31431 2011-05-04 21:13:02 +0900

benchmark/bm_io_select2.rb が作る pipe の数を少し減らしています。gdb で実行する時に gdb が file descriptor を必要とするため枯渇してしまわないようにしているとのこと。