ruby-trunk-changes r63791 - r63803

今日は主に SIGCHLD の処理と Process.wait などの処理の変更が一部の環境でうまく動かない問題の対処がありました。まだうまく動いていない様子(というか手元でテスト中にハングする)。

normal: r63791 2018-06-30 06:01:23 +0900

テスト用の test/unit の assert_in_out_err で子プロセスに渡す引数に --disable-gems を追加するようにしています。高速化のため。うーん、rubygems が必要なテストがあったりしたらどうするんだろ。--enable-gems を明示的に追加すれば良いのだろうけど。

svn: r63792 2018-06-30 06:01:24 +0900

version.h の日付更新。

normal: r63793 2018-06-30 07:13:02 +0900

r63758 の SIGCHLD の配送を独自に管理する変更で timer thread で SIGCHLD の受信を検出するための sigchld_hit という変数の型を rb_atomic_t に変更して代入を ATOMIC_EXCHANGE() を利用するようにしています。手元でテストでハングしてたのはこれかも。

normal: r63794 2018-06-30 07:20:12 +0900

Thread#raise のテスト? で MJIT が有効な時に assert_normal_exit のオプションに :reprieve を追加してタイムアウトを伸ばすようにしています。

normal: r63795 2018-06-30 09:51:57 +0900

macOS および Windows では SIGCHLD_LOSSY というマクロを真に定義して Process.wait などの実装を timer thread からの配送を待たず毎回割り込みチェック時に waitpid() をチェックするようなモードにしています。こっちかな。とにかく SIGCHLD の変更はシグナルとマルチスレッドという難しい題材で環境に依存するところも大きくてちょっと安定させるの大変そう。 [ruby-core:87705] [Bug #14867]

normal: r63796 2018-06-30 12:50:52 +0900

r63795 で導入した SIGCHLD_LOSSY の定義の条件に _WIN32 マクロの存在も追加して、mjit.c で waitpid() のエラー時に RUBY_SIGCHLD と SIGCHLD_LOSSY の値も表示するようにしています。 [ruby-core:87705] [Bug #14867]

normal: r63797 2018-06-30 15:11:33 +0900

waitpid_sys() という関数を定義して Windows 環境では WaitForSingleObject() を利用した実装に(それ以外では do_waitpid() を呼ぶ)ようにしてリストで管理されている wait されてる pid のそれぞれを処理する waitpid_each() で MJIT からの wait の時にはこちらを呼ぶようにしています。MJIT の実装と ruby 本体からで処理が違うんじゃないかなぁ、という感じで様子をみてるみたいです。

normal: r63798 2018-06-30 16:52:51 +0900

test/ruby/test_optimization.rb で assert_separately を使って子プロセスを起動するテストのタイムアウトを伸ばしています。うーん、これも SIGCHLD 処理変更の影響?

normal: r63799 2018-06-30 16:53:31 +0900

test/ruby/test_rubyoptions.rb のエラーを調査するため Process.wait で子プロセスの終了を待つ処理にタイムアウトをかけるようにしています。うーん、手元ではここじゃないところでハングしているのでなんか race condition があるんじゃないかなぁ。

kazu: r63800 2018-06-30 17:10:58 +0900

doc/contributing.rdoc の rurema へのリンクの URL を修正しています。

kazu: r63801 2018-06-30 17:11:16 +0900

doc/contributing.rdoc のリンクの http, git を https に修正しています。

normal: r63802 2018-06-30 17:38:36 +0900

r63799 のタイムアウトのための時刻を最初にも取得するようにしないと後置 until の条件で参照してるのでエラーになるのを修正しています。なるほど、これは気がつかなかった。

nobu: r63803 2018-06-30 20:56:54 +0900

r63758 の SIGCHLD の配送の変更で必要になったとのことで configure 時に macOS で強制的に setjmp の実装として sigsetjmp() を利用させるようにしています。