ruby-trunk-changes r38188 - r38221

今日は Mutex#owned? メソッドの追加、Lazy を使った時に発生する SEGV の修正、DL の不具合修正、非同期割り込みのタイミングの変更、Timeout.timeout の割り込みのポリシーの変更などがありました。

kosaki:r38188 2012-12-05 01:02:07 +0900

Mutex#owned? というメソッドを新設しています。 その Mutex を現在のスレッドがロックを保持しているかどうかを返すメソッドです。 なんでそんなメソッドが必要なのか、と思ったらチケットをみると「後始末をしたいけど今ロックを取得しているかどうかわからない」というケースがあるためということでした。 [ruby-dev:46697] [Feature #7505]

kosaki:r38189 2012-12-05 01:05:40 +0900

thread.c の wait_for_single_fd() の未初期化変数の警告除去。

kosaki:r38190 2012-12-05 01:06:43 +0900

thread.c の rb_mutex_lock() で変数 timeout_ms の宣言に volatile 修飾子をつけています。一見不要そうに思えるのですが、GVL_UNLOCK_BEGIN() という関数マクロの後で利用されていて、それがさらに RB_GC_SAVE_MACHINE_CONTEXT() を利用していて、先日 r38144 でこのマクロが展開された結果にレジスタの保存のための setjmp(3) が含まれるようになったので、これも "clobbered by 'setjmp' or 'vfork'" という警告の対策だと思われます。

usa:r38191 2012-12-05 01:08:05 +0900

テストでメモリ使用率を取得するための test/ruby/memory_status.rb で r38182 で文字列のクオートの範囲が広すぎた typo を修正。次の引数まで文字列リテラルに入れてしまっていました。

nobu:r38192 2012-12-05 02:36:19 +0900

id.c を id.h と同様に template/id.c.tmpl から自動生成するようにしています。このための元ネタを defs/id.def に書くようにしています。

tarui:r38193 2012-12-05 03:38:21 +0900

まず sleep_forever() や sleep_timeval() で sleep に入る前に RUBY_VM_CHECK_INTS_BLOCKING() を呼んで割り込みをチェックするようにしています。 また RUBY_VM_CHECK_INTS_BLOCKING() は Thread.async_interrupt_timing の機能でためられている割り込みの存在をチェックするようにしています。 Thread.current.raise のようにしてカレントスレッドに対して Thread#raise で非同期例外を発生させると(非同期といっても自分に対して送っているのに)その直後に sleep すると眠り続けてしまうので、眠る前に例外をチェックするようにしているのだと思います。

tarui:r38194 2012-12-05 04:06:46 +0900

r38193 で追加したテストの修正。

tarui:r38195 2012-12-05 04:11:42 +0900

r38194 の ChangeLog エントリの typo 修正。 まだ typo しているような気が。

zzak:r38196 2012-12-05 04:24:37 +0900

lib/README に RDoc 用の modeline を追加してマークアップを追加しています。

nobu:r38197 2012-12-05 10:23:03 +0900

r38196 で入った ChangeLog のコンフリクト時のマーカが残っていたのを削除。

kazu:r38198 2012-12-05 11:00:01 +0900

r38193, r38194 と r38195 の ChangeLogtypo 修正。

nobu:r38199 2012-12-05 11:37:41 +0900

標準ライブラリ mkmf.rb がマクロの定義の確認のために生成するソースコードに埋め込む文字列を diff の conflict があった時のマーカと似た >>>>>>> <<<<<<< のような文字列を含まないものに変更しています。多分自動的にチェックするボットとかを作ろうとしてここが邪魔だったので変えたということではないかと。

ko1:r38200 2012-12-05 11:43:31 +0900

TracePoint のテストでトレース取り終わったら後始末で TracePoint#disable するようにしています。

zzak:r38201 2012-12-05 11:55:07 +0900

標準ライブラリ shell.rb の rdoc コメントの追記をしています。 ChangeLog をみると doc/shell.rd(.ja) を削除するとありますが、これらのファイルは実際には消えてないですね。

ngoto:r38202 2012-12-05 12:20:05 +0900

いまいち理解できてないのですが拡張ライブラリ dl の DL::Function のデフォルトの abi の選択を CFunc#calltype を元に決定するように修正しています。なんとなく再修正されそうな感じです [ruby-core:50562] [Bug #7514]

nobu:r38203 2012-12-05 12:59:39 +0900

標準添付ライブラリ mkmf.rb の have_library のテストを追加しています。

nobu:r38204 2012-12-05 13:08:17 +0900

拡張ライブラリ psych, nkf, dl などのファイルの行末の空白を除去しています。

nobu:r38205 2012-12-05 15:30:34 +0900

mkmf.rb のテストのテストクラスの改名。

nobu:r38206 2012-12-05 15:30:36 +0900

mkmf.rb のテストでよく使う assertion をメソッドとして切り出すリファクタリング

nobu:r38207 2012-12-05 15:30:39 +0900

標準添付ライブラリ mkmf.rb の have_func のテストを追加しています。

drbrain:r38208 2012-12-05 16:07:28 +0900

RDoc の ChangeLog 形式のファイルパーサに対応するフォーマットを少し拡張しているっぽいです。また連続した同じファイルの変更などを1つにまとめるようにしているみたいです。

ko1:r38209 2012-12-05 16:56:07 +0900

test/ruby/memory_status.rb で require "dl/import" や require "dl/types" しているところで obsoleted の警告がでるので suppress_warning のブロックの中で require して警告を抑制するようにしています。

tarui:r38210 2012-12-05 18:54:58 +0900

Thread.async_interrupt_timing で :defer で割り込みを遅延している時に return や break でそのブロックから抜けようとすると、抜けた後に例外が発生する(非同期例外なのでどこで起きるかは通常は不定なのですが、Thread.current.raise でカレントスレッドに対して例外を投げた時は、例外が発生しているはずなのに return/break でメソッド/ブロックを抜けた後に例外が発生してしまっていたので、制御フローの移動の前に割り込みをチェックするようにしています。

ngoto:r38211 2012-12-05 22:24:19 +0900

Fiddle を使っている時に DL::Function#bind で @ptr を初期化していなかったためその後 DL::Function#call を呼ぶと SEGV していたのを修正しています。 DL と Fiddle の互換性の吸収漏れの一種? @ptr が存在しないからといって SEGV しないようにしたほうがいいような気もしますが難しいのでしょうか。 [ruby-dev:46708] [Bug #7516]

kazu:r38212 2012-12-05 22:35:05 +0900

r38202, r38210 の ChangeLogtypo 修正。

nobu:r38213 2012-12-05 22:46:11 +0900

(1..10).lazy.map{}.zip(){} のような Enumerator::Lazy が GC のマーク漏れで回収されて SEGV される不具合を修正しています。 ブロックから Proc オブジェクトを作る時に rb_vm_make_env_object() で生成する rb_block_t を wrap するオブジェクトがコンパイラの最適化により消されてマークされず GC で回収されて後続の処理で SEGV するのを防ぐため、vm_make_env_object() という関数に分離して第3引数でその rb_block_t を wrap したオブジェクトを返すようにして、最適化で消されるのを防いでいます。blockprocval を if のブロックの外のスコープに出して RB_GC_GUARD() ではだめだったんでしょうか。 [ruby-core:50545] [Bug #7507]

nari:r38214 2012-12-05 23:53:16 +0900

GC::Profiler の CPU 時間の測定に Linux では clock_gettime(2) により精度のよい測定ができるのでそれを利用するようにしています。 [ruby-core:50495] [Bug #7500]

nari:r38215 2012-12-05 23:56:58 +0900

r38214 の ChangeLog エントリにパッチ提供者の名前を追記しています。

kosaki:r38216 2012-12-06 00:04:09 +0900

標準添付ライブラリ timeout.rb の Timeout.timeout では別の Thread を生成してそこからタイマーで Thread#raise で割り込みをかけることでタイムアウト処理を実装していますが、デフォルトでは Thread.async_interrupt_timing(:on_blocking) を使うようにして完全な非同期ではなく、ブロックする処理(IO 待ちや sleep など)でのみ割り込みがかかるように変更しています。 つまり while true; 0; end とか loop { } みたいなビジーループする処理はタイムアウトで止まらなくなります。ただし Timeout.timeout のキーワード引数 immediate に true を指定すると従来のように全ての割り込みをチェックするポイントで止まるようにもできます。

svn:r38217 2012-12-06 00:04:16 +0900

version.h の日付更新。

naruse:r38218 2012-12-06 00:12:58 +0900

r38210 で追加したテストで、おそらく割り込みポイントを作るために未使用のローカル変数に代入している文があって、それが警告を出力してしまうので変数名をアンダースコアから初めるようにして警告対象から外しています。

naruse:r38219 2012-12-06 00:34:11 +0900

set_trace_func のテストで同名のメソッドの再定義による警告を避けるためのメソッド名変更や、未使用のローカル変数の警告除去のために変数名の頭にアンダースコアをつけるなどの修正。

kazu:r38220 2012-12-06 00:48:11 +0900

lib/timeout.rb のインデント修正と、r38216 の ChangeLog エントリの typo 修正。

tarui:r38221 2012-12-06 00:53:27 +0900

r38216 の Timeout#timeout の変更で Thread.async_interrupt_timing に指定する例外を実際に利用する例外クラスを指定する(デフォルトでは ExitException を継承した例外クラスを動的に生成して使っている)ようにしています。