ruby-trunk-changes r39677 - r39701

今日はタイマースレッドへの通知回りでリファクタリングや不具合修正がたくさんありました。また Windows 版での File.expand_path の修正と RubyGems の拡張ライブラリビルド時の修正の追加もありました。

tadf:r39677 2013-03-10 09:18:52 +0900

Complex() と Rational() のメソッドが解析できる文字列のフォーマットを rdoc に追記しています。

svn:r39678 2013-03-10 09:18:59 +0900

version.h の日付更新。

kosaki:r39679 2013-03-10 12:59:07 +0900

タイマースレッドへのシグナル通知用に使っている pipe の書き込み側を O_NONBLOCK フラグをセットしていたのを読み込み側にもセットするようにしています。

kosaki:r39680 2013-03-10 12:59:19 +0900

r36022 あたりでタイマースレッドがメインスレッド以外のスレッドがいない時に定期的な polling をやめるようにする処理を NativeClient では select(2) が利用できないのであきらめていたのを、もう少し具体的な条件で #ifdef で分岐するようにしています。

kosaki:r39681 2013-03-10 12:59:29 +0900

タイマースレッドへのシグナル通知の受信のために select(2) で pipe のチェックをしていたのを poll(2) に書き換えています。 select だと FD_SETSIZE よりも大きい fd を使えないためとのこと。

kosaki:r39682 2013-03-10 12:59:39 +0900

タイマースレッドへのシグナル通知用 pipe の読み捨てにラベルと goto 文を使っていたのを while ループに書き換えていて、読み取れたら空になるまで読み続けるようにしています。また EAGAIN でかえってきたケースを考慮するようにしています。 r39679 で読み込み側にも O_NONBLOCK をつけたため。

kosaki:r39683 2013-03-10 12:59:49 +0900

rb_thread_create_timer_thread() からタイマースレッド通知用 pipe の生成処理を setup_communication_pipe() として切り出すリファクタリング

kosaki:r39684 2013-03-10 13:00:00 +0900

ubf_select() で rb_thread_wakeup_timer_thread() を呼び出している部分になぜこれを呼ぶ必要があるかのコメントを追加しています。

kosaki:r39685 2013-03-10 13:00:10 +0900

rb_thread_wakeup_timer_thread_fd() がタイマースレッド通知用の pipe を直接 static 変数 timer_thread_pipe として参照するのをやめて、引数として受け取るようにしています。また setup_communication_pipe() から更に pipe を操作している部分を関数に切り出しするなどのリファクタリング

kosaki:r39686 2013-03-10 13:00:21 +0900

タイマースレッドへの通知用の pipe を2セットに増やして、timer_thread_pipe_low という優先度の低い pipe というのを追加しています。この pipe は polling モードで短い時間だけ待機する時には無視され、起こされるのを待つスレッドがいないため休眠モードでタイムアウト設定なしで眠る時にだけチェック対象にしています。 そして gvl_acquire_common() でこの timer_thread_pipe_low のほうを使って通知することで gvl_yield() するたびにタイマースレッドが起床して割り込みが発生することで thread starvation (切り替え処理ばかりが走る可能性がある?)に対処しています。 特に single core の VM 上で発生しやすいようです。 [ruby-core:53095] [Bug #7999]

kosaki:r39687 2013-03-10 13:00:33 +0900

プロセスで開いている file descriptor の最大値を管理する rb_update_max_fd() で ATOMIC_CAS() マクロを利用して排他処理するようにしています。 rb_update_max_fd() はタイマースレッドも呼ぶので GVL で保護されていたとしても複数スレッドから呼ばれる可能性がありました。

kosaki:r39688 2013-03-10 13:00:44 +0900

test/thread/test_queue.rb の Queue のテストで再現性の低い現象のテストのため繰り返し実行する回数を減らしています。 single core の環境で仕組み上どうしても時間がかかりすぎタイムアウトになるためだそうです。

kosaki:r39689 2013-03-10 14:06:58 +0900

probes.d で仮引数名が省略されていたのを追加しています。

nobu:r39690 2013-03-10 14:07:09 +0900

probes.d の svn property を設定しています。 追加されたのはかなり前ですけど。

kosaki:r39691 2013-03-10 14:11:56 +0900

r39689 で probes.d に仮引数名を追加したうち、symbol__create() の string という引数名は systemtap予約語にひっかかったため str に変更しています。

kosaki:r39692 2013-03-10 14:12:09 +0900

tool/gen_ruby_tapset.rb という systemtap で DTrace 対応を利用するために probes.d から tapset というものを生成するツールを追加しています。

nobu:r39693 2013-03-10 14:14:06 +0900

r39692 で追加したファイルの svn property 設定。

kosaki:r39694 2013-03-10 15:04:51 +0900

r39683 で重複して定義されていた setup_communication_pipe() という関数の後のほうを削除しています。

tadf:r39695 2013-03-10 17:01:32 +0900

r39677 で追記した Complex() と Rational() の受け付ける文字列フォーマットに前後の空白を無視することなどを更に追記しています。

nobu:r39696 2013-03-10 23:27:56 +0900

r39579 あたりで Gem::Ext::ExeConfBuilder.build でインストール先のディレクトリがソースディレクトリと同一だと一時ディレクトリを作ってそこにインストールさせるようにしていましたが、ディレクトリの同一性のチェックをやめて常に一時ディレクトリを作ってそこにインストールしてから生成物をコピーするようにしています。 [ruby-core:51437] [Bug #7698]

luislavena:r39697 2013-03-10 23:39:09 +0900

Windows 版で File.expand_path の第2引数に "~" が渡された時にホームディレクトリとして展開する処理が漏れていたので追加しています。 [ruby-core:53168] [Bug #8034]

nagachika:r39698 2013-03-11 00:08:04 +0900

r39696 の ChangeLog エントリが重複していたので1つ削除。

svn:r39699 2013-03-11 00:08:08 +0900

version.h の日付更新。

nagachika:r39700 2013-03-11 00:11:16 +0900

r39680 の ChangeLog エントリの typo 修正。

nobu:r39701 2013-03-11 00:26:48 +0900

r39697 で追加したテストは "C:" のような drive letter がある時だけ実行するようになっていましたが、 DRVIE が nil でも他の環境でも意味のあるテストなので分岐を外しています。また assertion のメッセージに ML 番号を指定しています。