ruby-trunk-changes r37866 - r37902

今日は RDoc 4.0 のマージ、Thread#join のいくつかの例外的な呼び出しを例外にする変更、トラップハンドラ内での Mutex 操作の禁止、TracePoint のインタフェース変更、プロセス終了時に全Threadを停止させる処理で ensure 節でブロックする処理が呼ばれた時の対処などなど、たくさんのコミットがありました。

kosaki:r37866 2012-11-26 23:55:56 +0900

NEWS ファイルに Thread#join が Signal.trap のハンドラ内で実行できない(ThreadError が発生する)ようになったことを追記しています。

kosaki:r37867 2012-11-27 00:17:01 +0900

Mutex#lock, unlock, try_lock, synchronize, sleep などの Mutex の操作も Signal.trap のトラップハンドラ内では実行できないように(ThreadError 例外が発生する)ようにしています。 また NEWS ファイルに Mutex と Thread#join の禁止と合わせてトラップハンドラ内で実行できなくなったことを追記しています。

svn:r37868 2012-11-27 00:17:06 +0900

version.h の日付更新。

usa:r37869 2012-11-27 01:01:51 +0900

README に Windows で Visual C++ を使ってコンパイルする場合は win32/README.win32 を参照するように追記しています。

nobu:r37870 2012-11-27 04:12:55 +0900

ext/extmk.rb で File::NULL や String#prepend など 1.9 で導入された機能が利用されていたのをやめて 1.8 でも動くように配慮しています。 [ruby-core:50160] [Bug #7439]

nobu:r37871 2012-11-27 04:19:51 +0900

string.c の rb_str_enumerate_bytes() の未初期化変数のコンパイラ警告を除去するため初期化を追加しています。

marcandre:r37872 2012-11-27 05:14:49 +0900

Array#delete の rdoc の戻り値の記述の修正およびサンプルコードの追加。 [ruby-core:50145] [Bug #7437]

kosaki:r37873 2012-11-27 07:49:36 +0900

r37865 でプロセス終了時の全スレッド停止を待つ rb_thread_terminate_all() で native_sleep() を使うように変更しましたが、割り込みフラグが立っていると native_sleep() はすぐ返ってきてしまうので RUBY_VM_CHECK_INTS_BLOCKING() で割り込みのチェックを挿入しています。

ko1:r37874 2012-11-27 08:01:45 +0900

TracePoint の情報を保持する rb_trace_arg_t にファイル名と行番号を保持するメンバを追加して、ファイルパス/行番号を cfp から取得する処理を1つの関数にまとめてそれを利用するようにリファクタリングしています。 またクラスの解決済みかどうかのフラグを保持するメンバも追加し、クラスの解決結果をキャッシュして再利用するようにしています。これまでも一度クラスが見つけることができれば再度探さないようにはしていましたが、結果 0 が格納される場合は毎回再度探していたので、一度探して結果 0 だった時も再度探さないようにしています。

kosaki:r37875 2012-11-27 08:08:36 +0900

プロセス終了時に全 Thread を停止する rb_thread_terminate_all() で ensure 節などで retry したり sleep したりして止まらなくなると、再度 Ctrl-C (SIGINT) 等で割り込んでも終了しなくなってしまう問題について、Thread の終了待ちのループでの割り込みの種類をチェックして Interrupt だったら再度全 Thread に kill を送信する処理から再度やりなおすようにしています。 これで止まらなくなってしまっても何度か Ctrl-C などで割り込みを送っていけば止まるようになったはず。 [ruby-dev:39107] [Feature #1952]

ko1:r37876 2012-11-27 08:25:21 +0900

TracePoint#file と TracePoint#line をそれぞれ TracePoint#path and TracePoint#lineno と改名し、対応する C の構造体メンバ名なども合わせて改名しています。 RubyVM::Backtrace::Location と名称を合わせたそうです。

ko1:r37877 2012-11-27 09:18:52 +0900

NEWS ファイルに TracePoint の追加について追記しています。

nobu:r37878 2012-11-27 09:58:52 +0900

ext/digest/md5/extconf.rb や ext/digest/sha1/extconf.rb、ext/digest/sha2/extconf.rb、ext/openssl/extconf.rb に require_relative が使われていたので 1.8 系の ruby でも動くように File.expand_path を使うように変更しています。 [ruby-core:50160] [Bug #7439]

nobu:r37879 2012-11-27 09:59:19 +0900

ext/extmk.rb でライブラリの実行毎に mkmf.log への File を close して余計なメッセージが出力されるのを防いでいます。

naruse:r37880 2012-11-27 10:35:13 +0900

r37871 で rb_str_enumerate_bytes() の ary の初期化を追加したのを UNINITIALIZED_VAR() マクロを使うように書き換えています。

tenderlove:r37881 2012-11-27 10:38:41 +0900

拡張ライブラリ fiddle が拡張ライブラリ dl の DL::Pointer や DL::Handler に依存していのたを、実装をコピーしてきて依存関係をなくしているようです。 dl の削除の準備ってことでしょうかね。コミットログを信頼して内容は全然見ていませんが。

nobu:r37882 2012-11-27 10:43:14 +0900

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

kosaki:r37883 2012-11-27 11:00:09 +0900

Thread#join で自分自身(Thread.current) に join しようとすると ThreadError を発生させるようにしています。 また NEWS ファイルにも追記しています。

kosaki:r37884 2012-11-27 11:00:19 +0900

さらに Thread#join でメインスレッドを join しようとした時も ThreadError を発生させるようにしています。メインスレッドが終了する時というのはプロセスを終了するのでお互いに待ち合ってデッドロックになるからですね。NEWS ファイルにもこの変更について追記しています。

kosaki:r37885 2012-11-27 11:00:29 +0900

rb_thread_terminate_all() で EXEC_TAG() に含まれる setjmp(3) があるため th 変数に再代入することで "clobbered by setjmp or vfork" の警告を除去しています。

kosaki:r37886 2012-11-27 11:00:40 +0900

プロセスの終了処理をする時にメインスレッドのステータスを THREAD_KILLED に設定しておくことで、後始末中にメインスレッドに Thread#kill や Thread#raise による割り込みがあれないようにしています。

ko1:r37887 2012-11-27 12:04:36 +0900

r37875 で rb_thread_terminate_all() による終了時の全 Thread 停止の待ちループ中に Interrupt 発生が追加された時に全 Thread に再度停止のための割り込みをかけるようにしましたが、常に native_sleep() から帰ってきた時は再度全 Thread に割り込みをかけるようにしています。

ko1:r37888 2012-11-27 12:18:29 +0900

r37887 だと rb_thread_terminate_all() で native_sleep() から抜けてきたら常に再度全 Thread への割り込みをしていたので、例外など割り込みがあった場合のみやりなおすように再修正しています。

drbrain:r37889 2012-11-27 13:28:14 +0900

RDoc の 4.0 をマージしています。内容はチェックしていませんが NEWS ファイルへの追記をみると ri フォーマットの変更で、 ri ドキュメントは再生成しないといけなさそうですが、その他非互換はあまりないバージョンアップだそうです。 参考URL: https://github.com/rdoc/rdoc/blob/master/History.rdoc

nari:r37890 2012-11-27 14:00:57 +0900

NEWS ファイルに GC の bitmap marking の導入と GC のマーク処理の再帰を利用しなくする変更について追記しています。

tenderlove:r37891 2012-11-27 14:59:34 +0900

r37881 の fiddle に dl から実装をコピーしてきて fiddle から dl への依存関係を消したコミットを revert しています。

drbrain:r37892 2012-11-27 15:01:41 +0900

rdoc の lib/rdoc/rubygems_hook.rb で RDoc#generate で @rdoc.store に Rdoc::Store のインスタンスを格納するようにしています。が、これ RDoc::Store.new して options から encoding やら dry_run やらオプションを設定してからそれを無視して再度 RDoc::Store.new していますがこれでいいんでしょうか。コミットログによると来たるべき RubyGems 2 のマージに備えた変更だそうです。

drbrain:r37893 2012-11-27 15:19:06 +0900

make rdoc で rdoc コマンドの --debug オプションを追加しています。 一時的なデバッグ用?

drbrain:r37894 2012-11-27 16:09:21 +0900

rdoc のテストの Windows 上での動作のための修正。 ファイルパスの扱いの違いや chmod が存在しないなど実行できないテストを skip しています。

drbrain:r37895 2012-11-27 16:29:00 +0900

もうひとつ rdoc のテストの修正で Windows 版での失敗を修正しているらしいですが詳細はよくわかりません。 Gem::Specification#loaded_from= に設定するファイルパスに @tmpdir を付与していたのがよくなかったようですが、Gem.use_paths @tempdir とかしているので不要だったのでしょう。なぜ Windows で失敗していたのかはともかく。

drbrain:r37896 2012-11-27 17:54:03 +0900

ソースディレクトリ以外でも rdoc を実行できるように --root オプションを追加して、make rdoc で --root にソースディレクトリを指定して他のディレクトリでも make rdoc できるようにしています。

ngoto:r37897 2012-11-27 19:21:59 +0900

r37861 で ruby_atomic.h に ATOMIC_CAS() というマクロ定義を追加したのに Solaris 版の実装を追加しています。

ko1:r37898 2012-11-27 20:58:10 +0900

ブロックを受け取っているメソッド内の Binding を利用して eval を実行してその中で yield すると SEGV する不具合を修正しています。 ブロックをスコープから引き剥がして Proc オブジェクトにする処理を rb_vm_make_proc() から rb_vm_make_env_object() に移動して、binding で Binding を作成する時にも実行されるようにしています。 [ruby-core:41038] [Bug #5634]

mrkn:r37899 2012-11-27 21:46:32 +0900

r37850 で Bignum の計算のうち GVL を解放する bigdivrem1() が割り込みを受けた時にやるなおすようにしていたのを、途中経過を構造体に記録しておいて途中から再開できるようにしています。テストがおもしろいですね。シグナルのトラップハンドラを利用して Bignum の時間のかかる計算に Process.kill で割り込みしようとしてみて、配列に格納したイベントの順番をみてうまくいってそうな時に結果をチェックするようにしています。割り込みを2回にしているのは Bignum の計算に入る前や終了したタイミングで割り込みかかるかもしれないのでその可能性を下げるためでしょうか。

eregon:r37900 2012-11-27 21:53:32 +0900

r37825, r37867, r37890 の NEWS への追記の typo 修正。

knu:r37901 2012-11-27 22:34:40 +0900

string.c の rb_str_enumerate_lines(), rb_str_enumerate_chars(), rb_str_enumerate_codepoints() で未初期化変数の警告回避のために代入文を追加した r37848 の修正は、宣言するところで UNINITIALIZED_VAR() を使う方法で回避したので revert しています。

nagachika:r37902 2012-11-28 01:20:21 +0900

r37867, r37874, r37877, r37884 の ChangeLog エントリの typo 修正。