ruby-trunk-changes r32013 - r32027

今日も開発合宿の成果で見ごたえのある修正が入っています。スレッドやロック関係の修正とメソッドキャッシュの扱いかたの変更などです。

tadf:r32013 2011-06-11 23:24:29 +0900

Date、DateTime の rdoc の体裁変更やサンプルコードの追加などです。

kosaki:r32014 2011-06-11 23:27:08 +0900

rb_thread_t::interrupt_flag の操作をきちんと排他して行なうようにしています。そのために signal.c に signal_buff のカウンタ用にあった atomic 操作用のマクロ群を atomic.h として分離して、さらに ATOMIC_EXCHANGE() というマクロを追加しています。 rb_threadptr_execute_interrupt_rec() で interrupt_flag をそのままビットチェック、クリアしていたのを ATOMIC_EXCHANGE() を利用するようにしています。 [ruby-dev:43467] [Bug #4770]

kosaki:r32015 2011-06-11 23:47:41 +0900

r32014 の ChangeLog のエントリにチケット番号を追加。

tadf:r32016 2011-06-12 01:07:37 +0900

Date, DateTime の rdoc の記述を修正/追記しています。

svn:r32017 2011-06-12 01:07:41 +0900

version.h の日付更新。

nobu:r32018 2011-06-12 09:32:32 +0900

atomic.h で _WIN32 で利用している _InterlockedOr は mingw では利用できないので gccインラインアセンブラで代用しています。また mingw 版では vm 毎に object space を持つ実装になっていないので、gc のパラメータ設定の修正も #if で一部括られています。

akr:r32019 2011-06-12 11:18:51 +0900

IO#copy_stream で sendfile(2) の実行前に select() で file descriptor の準備を待つ際に read, write 両方の descriptor で一緒に select() を実行していたために待つべきところで起きてしまっていたので、read 側 write 側をそれぞれ別々に待つようにしています。また Linux では regular file に対する select() は常にすぐかえるそうなので、read 側(regular file のはず?)の select は省略しています。 [ruby-core:36150] [Bug #4680]

ko1:r32020 2011-06-12 13:38:50 +0900

ベンチマークの追加です。マルチスレッドで 1つの Mutex を取りあう(対照群として 1 Thread で Mutex を取るだけのものも追加されています)状況のベンチマーク群です。

kosaki:r32021 2011-06-12 15:55:12 +0900

Mutex の deadlock 検出処理をシンプルにして pthread_cond_timedwait() の spurious wakeup (signal の受信もタイムアウトもしていないけど関数から抜けること。UNIX のシグナル受信時など)で誤動作しないようにしています。詳細はチケットを参照のこと。 [ruby-dev:43554] [Bug #4696]

kosaki:r32022 2011-06-12 15:58:15 +0900

rb_thread_t::transition_for_lock という構造体メンバを削除しています。 これも詳細はチケットに書かれているのでそちらを読んでいただくのが良いと思います。
この修正で BLOCKING_REGION_CORE マクロを利用しているところがなくなったので、削除するかGVL_UNLOCK_BEGIN() ... GVL_UNLOCK_END() を置き換えるかしたほうが良さそうですね。

nagai:r32023 2011-06-12 16:22:41 +0900

ext/tk/extconf.rb の修正です。 Mac OS X で tk のビルドに失敗するのに対応しています。主に変数の初期化の順番の変更のようです。 [ruby-dev:43655] [Bug #4853]

ko1:r32024 2011-06-12 17:53:15 +0900

メソッドキャッシュのクリアには rb_clear_cache, rb_clear_cache_for_undef, rb_clear_cache_by_id, rb_clear_cache_by_class などきめ細かくクリアする対象を制御してキャッシュから消していましたが、常に vm state version をインクリメントするだけにして、キャッシュからメソッドエントリを引く時に vm state version が更新されていたら常に再解決するようにしています。 [ruby-core:36908] [Feature #3905]
この修正にはちょっと歴史があって、non-blocking I/O を使うと IO::WaitReadable や IO::WaitWritable を extend した Errno::EAGAIN を発生させるために頻繁に特異クラスを持つオブジェクトが GC されて、その度にメソッドキャッシュがクリアされて高負荷になるという問題を、一旦は r29673 でメソッド定義が空のクラスの GC の時にはメソッドキャッシュをクリアしないようにしたものの race condition があったために r31378 で revert していたものです。こういう着地のしかたをしたんですね。

ko1:r32025 2011-06-12 18:12:38 +0900

benchmark/bm_vm3_clearmethodcache.rb を追加しています。大量にクラスを定義してメソッドキャッシュのクリアのベンチマークとしています。

tadf:r32026 2011-06-12 20:38:00 +0900

Date, DateTime の rdoc にさらにサンプルコードなどを追加しています。

tadf:r32027 2011-06-12 21:09:22 +0900

Date の Marshal.load 時に古いフォーマットのデータを新しい形式に変換した後の値を利用するように修正しています。