ruby-trunk-changes r36926 - r36938

今日は kosaki さんによる Thread まわりの修正がたくさん入っています。 deadlock 検出の誤作動(たくさんスレッドがあると稀に abort するようなのでかなりいやな種類の不具合)や IO#advise が SEGV する場合があった不具合の修正などもあるので、心当たりのある人はチェックしてみると良いかと思います。

kosaki:r36926 2012-09-09 15:27:02 +0900

deadlock 検出に race condition があり、複数のスレッドが同時に GVL を取得しようとしてお互いを不正な状態にあるとして誤って abort してしまう不具合を修正しています。 発生する race condition の詳細は [ruby-core:46994] を参照。これは rb_mutex_lock() で deadlock 検出のために最後に一人で lock 取得するスレッドは ptherad_cond_timedwait() で定期的に起きてチェックするようにしているのですが、ここで複数のスレッドが「自分が最後なのでタイムアウトつきで待とう」としてしまっているのがよくないようなので、別途 patrol_thread という変数に「最後に lock を取得するスレッド」つまり「定期的に起床して deadlock チェックする担当のスレッド」を保持しておくようにしています。 [ruby-core:44275] [Bug #6278]

svn:r36927 2012-09-09 15:27:07 +0900

version.h の日付更新。

kosaki:r36931 2012-09-09 16:20:00 +0900

io.c の io_bufread() と copy_stream_fallback_body() で不要な rb_thread_wait_fd() の呼び出しをしているため余分な poll(2) や select(2) のようなシステムコール呼び出しがあるのを削除しています。GVL 解放付きの読み込みだったり、単にバッファから取り出しているだけのところに付いていたので無駄だったのを削除しているようです。 rb_io_sysread() も同じく削除したい rb_thread_wait_fd() があるようですが、これを削ると non-blocking モードの IO の sysread で Errno::EAGAIN が発生することになってしまうため残しているようです。 [ruby-core:45789] [Bug #6629]

kosaki:r36932 2012-09-09 18:10:46 +0900

close(2), fclose(3) も可能なら(GVL を確保した通常の状態からの呼び出しなら) GVL を解放して呼び出すようにしています。 [ruby-core:35711] [Feature #4570]

kosaki:r36933 2012-09-09 18:24:35 +0900

IO#advise で fptr->pathv というメンバが Qnil である場合(pipe の時)があるのにチェックなしで RSTRING_PTR() でアクセスして SEGV してしまっていたのを修正するパッチの取り込みです。しかしどうやら io.c の変更は既に r34825 の一部で修正済みだったようで、このコミットではテストの追加のみとなっています。 [ruby-core:42880] [Bug #6081]

kosaki:r36934 2012-09-09 20:29:40 +0900

lib/sync.rb の RCS_ID という定数を削除しています。古代のバージョン管理システムの名残りですね。

kosaki:r36935 2012-09-09 20:32:11 +0900

include/ruby/intern.h の rb_thread_blocking_region() の宣言にコメントとして、deprecated なので rb_thread_call_without_gvl() の一族を使うほうが推奨だということを記しています。

kosaki:r36936 2012-09-09 20:34:47 +0900

Sync_m#sync_lock で待ち中に例外などで抜ける時に待っている Thread を管理しているインスタンス変数の変更が行なわれない不具合があったので ensure 節で後始末をするようにしています。 また共有ロックから排他ロックへの昇格をしようとした時の管理にも間違いがあったようなのでその修正もあります。 [ruby-dev:44521] [Bug #5355]

nobu:r36937 2012-09-09 20:36:47 +0900

新規追加されたファイルの svn:property 設定。

kosaki:r36938 2012-09-09 21:32:33 +0900

Queue や SizedQueue にも同様に pop, push(SizedQueue の場合) で待ち中に例外などで抜けると状態が不正になる問題があったので ensure で後始末をするようにしています。 [ruby-dev:44448] [Bug #5258]