ruby-trunk-changes r35253 - r35261

今日は WEBrick の不具合修正、JSON の不具合修正などがありました。

naruse:r35253 2012-04-08 06:50:34 +0900

WEBrick::HTTPResponse#send_body_io で IO オブジェクトをレスポンスの body として渡した時に IO#read でその内容を読んでいたので、IO オブジェクトの種類によってはバッファサイズ単位で無用にブロックしてしまう可能性があったので、IO#readpartial を利用して読めるところまで読んでその都度送信するようにしています。また関連するテストを追加しています。 [ruby-dev:45471] [Bug #6230]

svn:r35254 2012-04-08 06:50:39 +0900

version.h の日付更新。

naruse:r35255 2012-04-08 06:53:05 +0900

io.c の 改行コードの変換ありの場合(Windows 版)の io_unread() での off_t と int の演算結果を long の変数に代入していて警告/エラーが発生していたのを明示的キャストを追加しています。 [ruby-core:44137] [Bug #6257]
off_t の結果を long に入れているのでオーバフローしないか気になるところですね。

naruse:r35257 2012-04-08 08:41:27 +0900

WEBrick のテストで未使用のローカル変数の削除と、ビジーループしている所で Thread.pass を呼ぶようにしています。

naruse:r35258 2012-04-08 08:41:30 +0900

WEBrick::Utils::TimeoutHandler の内部で生成されるスレッドで @timeout_info という Hash を dup してから each するように r35199 で修正していましたが、Hash#key でキーの配列を取得してそれを利用するように再度修正しています。
"can't add a new key into hash during iteration" になるのは Hash#each の途中に別の Thread から(register メソッドで)その Hash に要素が追加されるからで、そこでは TimeoutHandler::TimeoutMutex で排他されているのですが、内部的に生成された Thread 内の処理が Hash#each する間その Mutex を使って排他処理していないので結局処理が同時に行なわれてしまう可能性があったようです。うーん singleton を使っているのはいいとして Mutex をインスタンス内ではなくクラスのほうに持たせている設計が悪いような気がしますね。

naruse:r35259 2012-04-08 15:26:48 +0900

readline の補完処理のテストで EditLine とリンクしていると失敗するものがあるようで、Readline::VERSION が "EditLine" を含んでいたらテストを飛ばすようにしています。

naruse:r35260 2012-04-08 22:46:50 +0900

IO#autoclose= のテストのために GC されやすくするように深く再帰したメソッド/ブロックから呼ぶようにしているメソッドの再帰の深さを100 から 50 に減らしています。 chkbuild (CRuby の CI)で BUS Error を起こしてしまっていたそうです。

naruse:r35261 2012-04-08 22:46:53 +0900

json の Bignum の JSON エンコード処理に RB_GC_GUARD() を追加しています。 fbuffer_append_str() 内(static 関数)の RB_GC_GUARD() の位置を関数末尾に移動するのがいいのではないでしょうか。