今日は Process.wait などのリクエストをリストで管理して、SIGCHLD のハンドリングを内部的なシグナルハンドラで行なって条件変数を使った待ち合わせでエミュレートするようにする変更などがありました。
k0kubun: r63752 2018-06-27 00:56:08 +0900
Module#autoload と String#crypt のテストが MJIT 有効時に失敗するのでとりあえず skip するようにしています。 autoload はともかく(具体的な理由はわかってないけどいかにも関係しそう)、String#crypt はなぜだろう。
svn: r63753 2018-06-27 00:56:09 +0900
version.h の日付更新。
normal: r63754 2018-06-27 08:44:00 +0900
bootstraptest/runner.rb の assert_finish というメソッドでタイムアウトの判定に Time.now を使っていたのを Process.clock_gettime の CLOCK_MONOTONIC を使って時計の歪みの影響を受けないようにしています。そして 0.1 秒ずつ sleep していたのを子プロセスに渡した pipe の close を検出するように IO.select と IO#read_nonblock を使ってループ回すようにしています。待ち時間を短縮するためみたいですね。
shyouhei: r63755 2018-06-27 09:57:16 +0900
insns.def でブロック内で関数の extern 宣言を書いていたのを internal.h に移動しています。
shyouhei: r63756 2018-06-27 10:10:02 +0900
insns.def で opt_str_freeze 命令と opt_str_uminus の内容がほぼ同じなのを vm_opt_str_freeze() という関数に切り出すリファクタリング。
mame: r63757 2018-06-27 11:37:26 +0900
r63754 の assert_finish で pipe の IO.select と IO#read_nonblock を使って待つようにする変更を revert しています。 ここは BASERUBY で実行されるため IO#read_nonblock が使えない可能性があるため。あー、なるほど runner.rb は BASERUBY での実行か。
normal: r63758 2018-06-27 12:14:30 +0900
SIGCHLD のハンドリングを内部的に独自の処理を書いて、現在 wait 中の pid をリストで管理してそれに対して timer thread で waitpid を WNOHANG で呼び出して結果を通知して起こす……みたいなことをしています。複雑になったなぁ。あと SIGCHLD はこれ以前にもなにか特殊な扱いをしてたような気がするけど、何をしてるんだっけ……。憶えてない。
これは MJIT でコンパイラのために子プロセスを起動するので Process.wait などがその子プロセスにも反応してしまうという問題の回避のための処理みたいです。二重 fork して worker 起動するためのプロセス作るのじゃ駄目なのかなぁ。これはこれで(バグがなければ) SIGCHLD の取り漏らしがなくなっていいような気もするけど。 [ruby-core:87605] [Bug #14867]
normal: r63759 2018-06-27 12:16:54 +0900
r63758 で Process.wait と MJIT の問題を対処したので test/ruby/test_process.rb の skip を削除しています。
normal: r63760 2018-06-27 12:16:59 +0900
rubyspec でも r63758 の対応を受けて Process.wait のテストの skip を削除しています。
normal: r63761 2018-06-27 15:01:33 +0900
r63758 で pid_t を直接使ってしまっていたところを rb_pid_t を使うように修正しています。
normal: r63762 2018-06-27 17:24:10 +0900
さらに r63758 の修正。マクロ grantpt() で引数名の展開を間違えていたのを修正。 [Bug #14871]
shyouhei: r63763 2018-06-27 18:28:09 +0900
r62051 の VM 命令の定義の属性に handle_frame というのを追加して stack frame と pc の操作を命令ごとに変える最適化ですが、位置情報が正しく取れないなどの問題があって、うまくいかなかったのでやめています。 [ruby-dev:50557] [Bug #14809] [ruby-core:87449] [Bug #14834]
normal: r63764 2018-06-27 19:09:33 +0900
r63758 の SIGCHLD の処理の変更で ruby のアプリケーションから rb_waitpid() WNOHANG でブロックしないように子プロセスの終了をチェックした時に誤って ECHILD エラーを返してしまう可能性があったのを修正しているそうです。なんだけど条件分岐をみても元の分岐がなにをしようとしていたのかがよくわからないんだよなぁ。
ko1: r63765 2018-06-27 19:36:49 +0900
r63687 あたりの PUSH() マクロで VM_ASSERT() で内部的オブジェクト(struct RBasic::klass が 0)が VM スタックに積まれないようにチェックしていたのを削っています。大丈夫だったから、ではなく T_IMEMO の内部的オブジェクトが積まれるケースがあったそうで、対策したら後でまた復活させる予定みたいです。
eregon: r63766 2018-06-27 20:37:19 +0900
mspec に upstream の変更を merge しています。
eregon: r63767 2018-06-27 20:37:31 +0900
rubyspec に upstream からの変更を merge しています。
eregon: r63768 2018-06-27 21:30:05 +0900
さらに rubyspec を更新しています。