ruby-trunk-changes r37711 - r37735

今日は引き続き DTrace 関連のビルド方法の修正、Thread#backtrace_locations の追加と Thread#backtrace の引数追加、Mutex#synchronize の不具合修正や Signal.signame の追加、シグナル処理廻りのコード整理、Struct#each_pair のブロックパラメータの渡しかたの変更などいろいろありました。

ngoto:r37711 2012-11-19 01:30:10 +0900

vm_core.h に定義していた RUBY_DTRACE_FUNC_ENTRY_HOOK() と RUBY_DTRACE_FUNC_RETURN_HOOK() の関数マクロ定義を probes_helper.h として切り出すことで不要な probes.h への依存関係を切るようにしています。

svn:r37712 2012-11-19 01:30:14 +0900

version.h の日付更新。

naruse:r37713 2012-11-19 10:04:53 +0900

r37711 の DTrace のビルド方法の変更に FreeBSD でのビルドが可能になるように修正をしているようです。 DTrace のビルド関連の修正は r37717 あたりまでもういくつか続きます。

naruse:r37714 2012-11-19 11:06:39 +0900

vm_dump.o の probes.h への依存関係が抜けていたのを追加。

usa:r37715 2012-11-19 14:56:38 +0900

r37711 および r37713 の DTrace 対応のビルドの再修正。 probes.h の依存関係の記述を common.mk に移動して probes.h を $VPATH をみるのではなく必ずソースディレクトリにあるものを参照するようにしています。あと win32/Makefile.sub の .SUFFIXES は元々重複していたものを削除したのでしょうか。

ko1:r37716 2012-11-19 15:07:06 +0900

Thread#backtrace_locations というメソッドを新設しています。 これは Thread#backtrace の元となる情報を文字列化せずに RubyVM::Backtrace::Location オブジェクトのまま配列で返すものです。 caller に対する caller_locations と同じですね。 また Thread#backtrace に引数として level (現在のフレームから起点を遡って指定できる)と n(取得するフレームの情報数)を指定できるようにしています。

naruse:r37717 2012-11-19 15:11:36 +0900

r37711, r37713, r37715 に続いて DTrace 関連のビルドシステムの修正。 probes.h の参照に $VPATH を使っていたのが残っていたのを修正、また make dist-clean 時に probes.dmyh を削除しないように(というよりは VPATH が残っていたのを削除?)。また FreeBSD で DTrace を有効にする時には libelf をリンクするようにしています。

shyouhei:r37718 2012-11-19 15:41:43 +0900

.travis.yml の設定で make test を実行する時に OPTS=-v を指定して verbose モードで実行するようにしています。

nobu:r37719 2012-11-19 16:08:13 +0900

common.mk で RUBYLIB に "-" をセットしていたのが test/ruby/test_encoding.rb の test_unsafe のテスト($SAFE=4 の時の String#encode のテスト)に影響していたそうで FILE_SEPARATOR をセットするように修正しています。どういうことかよくわかりませんが、テスト実行に影響するだけだとは思います。

nobu:r37720 2012-11-19 16:17:56 +0900

r37717 で DTrace が有効な時は libelf をリンクするようにしましたが FreeBSD の時だけ追加するようにしています。

nobu:r37721 2012-11-19 16:31:05 +0900

Struct#each_pair がブロックに渡すブロックパラメータが assoc になっていなかったので Hash#each_pair や OpenStruct#each_pair と同様に assoc を渡すように変更しています。
これらはどれも 2引数のブロックパラメータを受け取るように rdoc に記述されているのですが、ブロックパラメータに1つしか変数が受け取られていなかった時に、Struct#each_pair だけは1つめのブロックパラメータ(つまり項目名、key)だけが代入されていたのを、assoc を渡すとその1つの変数に [key, value] の配列が格納されるようになります。 [ruby-dev:46533] [Bug #7382]
ちなみに Hash#reject などはやはり assoc ではないのでブロックパラメータ変数が1つだとキーのみが格納されるようになっています。ややこしいですね。

nobu:r37722 2012-11-19 16:54:53 +0900

r37722 で変数名を typo していたのを修正しています。 [ruby-dev:46533] [Bug #7382]
これコンパイル通らなかったんじゃ……っていうツッコミはきっとさんざんされたことでしょう。

kosaki:r37723 2012-11-19 18:43:53 +0900

Signal.signame メソッドを新設しています。これはシグナルの番号からシグナル名の文字列を返すものです。 Signal.trap で登録するシグナルハンドラにはシグナルが番号で渡されるので、そこからシグナル名を簡単に引けるように追加されたメソッドです。 [ruby-dev:44858] [Feature #5613]

kosaki:r37724 2012-11-19 19:22:53 +0900

prelude.rb で起動時に実行される Ruby スクリプトとして実装されていた Mutex#synchronize を rb_mutex_synchronize_m() として C で実装しなおしています。 Ruby 実装では非同期例外による割り込みに対して意図しない場所で割り込まれて正しくロック解放できない可能性が排除できないために C 実装にしたというものだと思います。 [ruby-core:34362] [Bug #4266]

kosaki:r37725 2012-11-19 19:35:34 +0900

Signal.trap で Ruby レベルでのシグナルハンドラを設定時に pthread_sigmask() で(pthread_sigmask() がある環境なら)シグナルマスクを設定していたのをやめています。 現在の Ruby レベルのシグナルハンドラは C の signal handler とは別もので、タイマースレッドがチェックするだけなのでマスクは不要になっていたようです。その関連で USE_TRAP_MASK というマクロ定数や struct trap_arg という構造体も削除しています。

kosaki:r37726 2012-11-19 19:38:02 +0900

install_sighandler() (初期化時にデフォルトのシグナルハンドラを登録する関数)でrb_disable_interrupt() でシグナルマスクを設定している理由についてコメントを追記しています。またここでシグナルハンドラを設定した時に元のハンドラが SIG_DFL でなかった時に元に戻している理由として、exec した時に元のハンドラの情報が残っているケースを考慮していることも追記しています。なるほどー。ここ書き戻しているところ謎だと思ってたことがあったような気がするのですがそういうことだったのか。

kosaki:r37727 2012-11-19 19:54:55 +0900

タイマースレッドがシグナルハンドラが通知した atomic 変数をチェックする時にシグナルマスクを設定しているのをやめています。 pthread_sigmask() によるマスクはそのスレッドにしか影響しないので意味がないからとのこと。なるほど。
ちなみになんかこのあたり見覚えがあるなーと思ったら自分が報告したチケットに対する修正で入った部分でした。 [Bug #4950]

kosaki:r37728 2012-11-19 20:04:39 +0900

rb_threadptr_execute_interrupts_common() を rb_threadptr_execute_interrupts() として改名しています。rb_threadptr_execute_interrupts() は同じ引数で rb_threadptr_execute_interrupts_common() を呼んでいるだけで実質同じ関数で、 rb_threadptr_execute_interrupts_common() のほうは static だったので外から見える影響もありません。

kosaki:r37729 2012-11-19 20:07:53 +0900

rb_thread_blocking_region_end() でカレントスレッドを取得するのに GET_THREAD() を利用せず ruby_thread_from_native() という関数を利用するように修正しています。 GET_THREAD() はグローバル変数 ruby_current_thread を参照するだけですが、この位置では GVL を解放した状態(再取得する前)なので、ruby_current_thread が自分の thread を参照していないので thread local storage などから取得する確実な方法を利用するようにしています。 rb_thread_blocking_region_end() は既に deprecated としてマークされている関数でコアでは利用されていませんので ruby 本体は影響なかったですが拡張ライブラリで利用していたものはマズかったはず。

kosaki:r37730 2012-11-19 20:10:24 +0900

thread.c, vm_core.h で全体的にカレントスレッドを格納する引数、変数名の th を cur_th に変更するリファクタリングをしています。 この変更については ruby-dev で議論になっているのでまた変更があるかもしれません。 [ruby-dev:46540]

kosaki:r37731 2012-11-19 20:13:40 +0900

rb_threadptr_async_errinfo_active_p() で非同期例外の処理をスキップできる理由(というかスキップする理由)についてのコメントを追加しています。

kosaki:r37732 2012-11-19 20:15:07 +0900

thread.c の GET_THREAD() を余分に利用しているところの修正および th を cur_th にもうひとつ改名しています。

ngoto:r37733 2012-11-19 21:37:43 +0900

vm_dump.c から #include "probes.h" を消して vm_dump.o の probes.h への依存を切っています。 include していたものの実際には利用していなかったみたいです。

nagachika:r37734 2012-11-19 22:31:26 +0900

r37716 での vm_backtrace_to_ary() の引数名の typo 修正。

ngoto:r37735 2012-11-19 23:12:48 +0900

configure の --enable-dtrace オプションのヘルプメッセージへDTraceが有効なプラットフォームでは自動で enable になることの追記と、FreeBSD でオプション指定しないと無効になるように特別扱いされていたのをやめています。