今日は kosaki さん無双で、IO.select 関連の不具合修正やベンチマークの追加などでした。
kosaki:r31384 2011-04-30 00:20:00 +0900
GVL_SIMPLE_LOCK が非0に定義されていて Thread のスケジューリングに単純な mutex lock が利用されていた時に mutex を初期化前に利用する不具合を修正。デフォルトは GVL_SIMPLE_LOCK は 0 に define されているので通常は顕出しないところです。
svn:r31385 2011-04-30 00:20:05 +0900
version.h の日付更新。
kosaki:r31386 2011-04-30 00:43:55 +0900
include/ruby/win32.h に rb_w32_subtract() の宣言が重複していたのでひとつ削除。
kosaki:r31389 2011-04-30 04:09:44 +0900
コミットログには ext/io/wait 向けのテストの追加をしたとあります、が ChangeLog の変更のみでテストスクリプトがコミットもれのようです。
kosaki:r31390 2011-04-30 16:16:31 +0900
IO.select のベンチマークが追加されています。 [Feature #4531]
kosaki:r31391 2011-04-30 16:30:45 +0900
IO.copy_stream で rb_fd_init() で初期化するタイミングを早くしています。rb_ensure() で終了処理から呼ばれる rb_fd_term() で初期化済み(確保済み)のメモリ領域を開放する処理があるので rb_ensure() に入る前に初期化するようにしています。
kosaki:r31393 2011-04-30 20:08:39 +0900
do_select() でタイムアウト値を再計算する処理が #ifndef linux で括られていたのをやめています。gettimeofday(2) を呼ぶ負荷を避けていたのだと思いますが問題ないらしいです。
kosaki:r31394 2011-04-30 20:15:15 +0900
rb_thread_select() という API を deprecated にしています。代わりに rb_thread_fd_select() を利用するように拡張ライブラリも変更しています。これは GVL を開放して select(2) を呼ぶバージョンです。
ということはこれまで一部の拡張ライブラリでは GVL 保持したまま select でブロックしていたんですねー。
[追記]などということはなく前も GVL解放していたようです。うーんどうもこのところコミット読みの精度があまいですね。[/追記]
kosaki:r31395 2011-04-30 20:18:14 +0900
rb_fd_copy() の引数を変更して rb_fdset_t::max は常に src からコピーするようにしています。公開API の変更ですが、本体ではどうも元々利用されていなかったようですね……。
kosaki:r31396 2011-04-30 20:23:08 +0900
do_select() の引数の型を fdset -> rb_fdset_t に変更。do_select が fdset を直接 *var のように dereference している不具合を修正しています。ファイルディスクリプタが大きいとちゃんと動いてなかったようですね。 [ruby-dev:43460] [Bug #4636]
kosaki:r31397 2011-04-30 23:11:34 +0900
win32/win32.c に rb_w32_fdcopy() を追加して Windows 版でも FD_SETSIZE を越える fdset を正しくコピーできるように実装しています。