ruby-trunk-changes r35486 - r35488

今日はスレッドのタイマー割り込みの処理についての修正が入っています。昨日の対応のより根本的な修正になっています。

ko1:r35486 2012-04-28 18:59:44 +0900

r35480 でメインスレッドがスレッド切り替えばかりして処理本体に入れなくなる現象の対処を別の方法で行なっています。起きていた現象については http://bugs.ruby-lang.org/projects/ruby-trunk/wiki/R35480_ExtendedMemo にまとめられています。タイマースレッドとも関係していて、GVL 解放して別のスレッドに処理を明け渡している状態のスレッドにタイマースレッドから割り込みフラグが立てられる可能性があって、そのため GVL を再獲得しても直ぐにまた gvl_yield で別スレッドに譲ってしまうという現象のようです。これを避けるために rb_thread_t::yielding という構造体メンバを追加して、gvl_yield() で GVL を明け渡し中のスレッドにはタイマー割り込みがされないようにしています。
要はタイマー割り込みのフラグを rb_threadptr_execute_interrupts_common() の ATOMIC_EXCHANGE() で読み取ってから次に再チェックするまでの間にまたタイマー割り込みがあると延々このループで割り込み処理だけしてしまうということですね。

svn:r35487 2012-04-28 18:59:48 +0900

version.h の日付更新。

nobu:r35488 2012-04-28 23:22:25 +0900

r35354 で追加した Windows 版の DLL ロードのテストでテスト用に生成する DLL ファイルを extconf.rb 実行時に事前に削除しておくようにしています。古いのが残っていて再コンパイルされないとかを防ぐためでしょうか。