ruby-trunk-changes r45888 - r45907

今日はメインスレッド以外のスレッドで fork した子プロセスが exec せずに終了時にうまく終了しない不具合の修正や、Mac OS X での Dir.glob のエンコーディングの変更のほか、シグナルに関するテストでシグナルハンドラをリセットして実施するようにする修正などがありました。

akr: r45888 2014-05-09 22:57:04 +0900

変更した Process.spawn のオプションに [:out, :err] => filename のように配列でまとめて複数の fd のリダイレクト先を指定する記法(最近 r45828 でこの時のファイル作成の挙動の変更がありました)について rdoc 用コメントに追記しています。

nobu: r45889 2014-05-09 23:31:27 +0900

signal.c の ruby_signal() で if 文で条件分岐していたところを switch 文に書き換えています。if 文の条件部に #if の preprocessor による分岐も入り混っていたのですっきりさせるためかなと思います。

nobu: r45890 2014-05-09 23:31:34 +0900

thread_pthread.c と thread_win32.c の native_cond_timedwait() の引数に const を付加する変更です。

nobu: r45891 2014-05-10 00:13:11 +0900

シグナルハンドラについてのテスト test_propagate_signaled と test_hup_me で Signal.trap に "DEFAULT" を渡してデフォルトのシグナルハンドラにリセットしてからテストするようにしています。 親プロセスのシグナルハンドラの影響を受けないようにしています。また test_hup_me のほうは元々 fork せずにテストしていたので assert_separately を使って子プロセスでテストするように修正しています。

svn: r45892 2014-05-10 00:13:22 +0900

version.h の日付更新。

nobu: r45893 2014-05-10 01:15:30 +0900

r45891 で test_hup_me に追加した assert_separately の引数が不足していたので追加しています。

akr: r45894 2014-05-10 08:48:47 +0900

Signal.trap で元々デフォルトのシグナルハンドラが設定されていた(sigaction(2) で SIG_DFL が返ってきた)時に "SYSTEM_DEFAULT" という文字列を返すようにしています。

nobu: r45895 2014-05-10 09:32:58 +0900

test/ruby/test_thread.rb の Thread とシグナルに関するテストでもシグナルハンドラをデフォルトにリセットしてから実行するようにしています。

hsbt: r45896 2014-05-10 09:33:38 +0900

man/ruby.1 のマニュアルの既に存在しなくなったサイトへのリンクを削除しています。 GitHub に昔は言語毎のリポジトリがあったのがなくなっているんですね。 [ruby-core:62145] [Bug #9773]

nobu: r45897 2014-05-10 10:00:37 +0900

r45894 の Signal.trap の挙動の変更時に追加したテストが SIGQUIT のシグナルハンドラ設定を使っていたので、SIGQUIT が存在するプラットフォームでだけ実行するようにしています。

nobu: r45898 2014-05-10 13:32:10 +0900

thread_pthread.c の timer_thread_sleep() で errno を swich 文の条件部と関数呼び出しの引数に使っていたところをローカル変数に代入してからそれを使うようにしています。 むむ、これはなぜでしょう。 thread_pthread.c には他にも同様に errno で分岐して rb_async_bug_errno() に errno を直接渡しているところがありますがそれらも変更したほうがいいのでしょうか。

nobu: r45899 2014-05-10 13:32:22 +0900

メインスレッド以外の Thread で fork すると終了時にうまくプロセスが終了してくれないという不具合を修正しています。 thread_start_func_2() でスレッド終了時に自分がメインスレッドだった時(普通はそんなことはないのですが、fork でできた子プロセスでは Thread が fork 時にメインスレッドに変化することがありえる)は ruby_stop() を呼んで停止するようにしています。 こんな不具合が入ってたとは…よくこれまで気がつかなかったですね。。。 [ruby-core:62070] [Bug #9751]

nobu: r45900 2014-05-10 13:41:02 +0900

Kernel#exit の実装である rb_exit() で ruby_finalize() + exit(3) を呼び出していたところを ruby_stop() に置き換えています。 ちなみに ruby_stop() は ruby_cleanup() + exit(3) で、他の Thread を停止したり VM を破棄したりとかもうちょっとやることが多いみたいです。

nobu: r45901 2014-05-10 21:15:06 +0900

test-all 用のユーティリティ test/ruby/envutil.rb で子プロセスの状態をメッセージにするための FailDesc という定数に格納している Proc オブジェクトで、子プロセスがシグナルで終了したのでない場合に Process::Status#termsig が nil を返すのに常にシグナル番号があるものとして扱っていたので修正しています。

nobu: r45902 2014-05-10 21:15:09 +0900

test/ruby/envutil.rb の invoke_ruby にキーワード引数 rubybin を追加して起動する ruby インタプリタのファイル名を指定可能にしています。

nobu: r45903 2014-05-10 21:15:19 +0900

拡張ライブラリ io/console のテスト test_noctty でエラー時のメッセージを詳細にするようにしています。 r45901 と r45902 の envutil.rb の修正はこれが目的だったみたいですね。

nobu: r45904 2014-05-10 22:37:58 +0900

Mac OS X で Dir.glob は常にエンコーディングUTF-8 としてマッチするようにしています。 [ruby-dev:48213] [Bug #9825]

nobu: r45906 2014-05-10 23:47:04 +0900

thread_pthread.c のブロック処理中のスレッドへの割り込みを行なう ubf_select() で pthread_self() がタイマースレッドかどうかチェックするのに pthread_t 型の変数を直接比較していたのを pthread_equal() を使って判定するように修正しています。

nobu: r45907 2014-05-10 23:48:58 +0900

タイマースレッドへの通知用のパイプ timer_thread_pipe, timer_thread_pipe_low などの static 変数を構造体にまとめるリファクタリングです。