ruby-trunk-changes r31373 - r31383

今日は GVL のパフォーマンスの修正と、IO#write での改行の自動変換(主に Windows での)の不具合修正がありました。

kosaki:r31373 2011-04-29 10:11:28 +0900

Mutex#lock で多数の Thread が待つ時にビジーループになっていてパフォーマンスが悪かったのを native_cond_timedwait() を使って短時間(100msec)スリープするようにして改善しています。 [Feature #4607]
これは Mutex#lock (や synchronize) だけじゃなくて、全ての Thread が IO などブロックする処理後に GVL 取得しようとする場合でも性能低下してたんでしょうか。ちょっとお仕事的にも気になりますね。
[追記]GVL は関係なくて Mutex#lock の時だけだそうです。コメント欄も参照してください。[/追記]

svn:r31374 2011-04-29 10:11:31 +0900

version.h の日付更新。

kosaki:r31375 2011-04-29 10:18:11 +0900

thread.c の lock_func() while の条件部で少しトリッキーな書き方がされていたところを整理するリファクタリングをしています。

kosaki:r31376 2011-04-29 10:18:51 +0900

r31373 の ChangeLog のエントリに Redmine のチケット番号のリンクを追記。

nobu:r31377 2011-04-29 10:24:54 +0900

出力時の改行の変換のフラグ設定を既に他のフラグが立っている時にも追加してしまっていたことによる不具合を修正。Windows で make test-all が失敗していたのを修正しています。 [Bug #4618] [Bug#4619]

kosaki:r31378 2011-04-29 10:29:22 +0900

r29673 を revert しています。これが SEGV を起こすためだそうです。 [ruby-core:34554] [Bug #4289]
この r29673 は個人的に思い出深いコミットで(当時の changes) non-blocking IO を使うと特異クラスが頻繁に生成されるのでそれが GC される時にメソッドキャッシュがクリアされることでパフォーマンスが悪くなるという現象に対策したものです。

kosaki:r31379 2011-04-29 10:44:32 +0900

ベンチマークを追加しています。GVL の性能を評価するためのたくさん Thread を生成するベンチマークです。 CRuby ではベンチマークのコミットは珍しいですね。

kosaki:r31380 2011-04-29 11:06:36 +0900

r31379 で追加したベンチマークスクリプトsvn の property を追加しています。

kosaki:r31381 2011-04-29 12:23:13 +0900

thread.c のインデント修正。

kosaki:r31382 2011-04-29 13:18:29 +0900

r31373 で native_cond_timedwait() を利用するようになりましたが、Windows 版の thread_win32.c では native_cond_timedwait() が実装されていなかったので追加しています。

nobu:r31383 2011-04-29 21:12:52 +0900

thread_win32.c と include/ruby/win32.h に関数のプロトタイプ宣言を追加しています。 thread_win32.c のほうは r31382 で削除されたものの復活ですが、include/ruby/win32.h の rb_w32_subtract() の宣言は2つになってしまっていますね。