ruby-trunk-changes r64565 - r64584

今日は rubyspec の更新や sigwait の内部実装の変更などがありました。

eregon: r64565 2018-08-27 23:25:00 +0900

rubyspec に upstream からマージしています。

svn: r64566 2018-08-27 23:25:02 +0900

r64565 のファイル末尾に改行がなかったのを追加。

eregon: r64567 2018-08-27 23:25:14 +0900

template/fake.rb.in で tool/fake.rb を読み込む時に File.binread で読み込み external encoding や internal encoding の影響を受けないようにしています。

eregon: r64568 2018-08-27 23:33:10 +0900

r64567 の再修正。環境変数の値に String#b を呼んで ASCII-8BIT 化してましたが、値が nil の時を考慮するようにしています。

eregon: r64569 2018-08-27 23:49:56 +0900

rubyspec に再度 upstream からマージ。 r64566 で svn さんが自動で末尾改行を追加したファイルは末尾改行がないファイルを読んだ時のテストのためにわざと追加したものだったみたいなので、ファイルは消して動的に一時ファイルを作るようにしています。

svn: r64570 2018-08-27 23:49:57 +0900

r64569 の spec/ruby/language/fixtures/utf16-le-bom.rb てファイルの末尾に改行がなかったので追加しています。

eregon: r64571 2018-08-28 01:22:21 +0900

再度 rubyspec に upstream からマージ。

svn: r64572 2018-08-28 01:22:22 +0900

またしても r64571 でファイル末尾の改行がなくなってたので追加。

eregon: r64573 2018-08-28 01:38:37 +0900

rubyspec の Etc.sysconf(Etc::SC_TZNAME_MAX) のテストで Integer ではなく nil を返すこともあるみたいなのでチェックを修正しています。

svn: r64574 2018-08-28 01:38:38 +0900

version.h の日付更新。

normal: r64575 2018-08-28 02:17:08 +0900

do_gvl_timer() 内で timer thread 役をする thread の vm->gvl.timer へのセットを POSIX timer の解除(disarm)前に早めて、main thread 以外が threadptr_trap_interrupt() を呼ぶ時に一時的に vm->gvl.lock のロック解除するのをやめています。うーむ、わからん。
ところでようやく気がついたんですがこの一連の(timer thread 廃止の?)変更は auto fiber (というのが議論されていることだけは知ってるけど具体的な中身はよく知らない)への布石のつもりだったみたいですね。

normal: r64576 2018-08-28 02:17:13 +0900

waitpid() の独自実装のための SIGCHLD 処理に使う struct waitpid_state のメンバーから sigwait_fd を削除して pipe による通知ではなく rb_threadptr_interrupt() による普通の(?)割り込みで待ってる thread を起こすようにしています。と、思ったけど ruby_waitpid_locked() をみるとローカル変数として sigwait_fd を使った rb_sigwait_sleep() の呼び出しが残ってますね。MJIT の worker かどうかによるのか。難しい……。また rb_thread_sleep_interruptible() という割り込みチェックを native_sleep() 前にしない版の sleep 関数を導入してこれで waitpid 用の wait にしてますが、利用箇所は限定されてるとはいえ、これ本当に大丈夫かー? という気がしてしまいますね(今度は割り込みの喪失が……とかありそう)。

normal: r64577 2018-08-28 03:37:04 +0900

と、思ったらさっそく r64576 で wakeup miss があったとのことで追加修正。 waitpid_each() の割り込み処理を waitpid_signal() という関数に切り出して sigwait_fd_migrate_sleeper() からもこれを呼び出して待ってる thread の待ちかたによって起こしかたを(rb_threadptr_interrupt() にするのか fd を使った通知にするのか)を変えるようにしています。

eregon: r64578 2018-08-28 04:08:38 +0900

rubyspec の 拡張ライブラリ etc の Etc.sysconf のテストで assertion をループで書くようにリファクタリングしています。また全ての定数を渡した時の結果に対して nil も許容するように統一しています。

normal: r64579 2018-08-28 08:29:44 +0900

ubf_select() にて起こす対象の thread が timer thread 役になってないかのチェックと同時に sigwait_th になってないかもチェックするようにしています。 r64575 で sigwait_fd を使った待ちを一部やめた影響で deadlock の恐れがあったようです。

normal: r64580 2018-08-28 08:39:58 +0900

sigwait_th と sigwait_fd について説明のコメントを追加しています。丁度さっきのコミットで sigwait_th ってなんだって思ったのでした。sigwait_th は sigwait_fd からの読み込みをする権利を持っていて、sigwait_fd で ppoll(2) することで sleep してる(かもしれない) thread だそうです。
うーん、てことは timer thread 役の thread と sigwait_fd で待ってる thread はどっちかがいたらいいのか? いや一定時間の割り込みは timer thread 役の thread の仕事なので、r64579 の sigwait_th だったら timer thread を起こさなくていいという修正の意味がよくわからなくなってくるなぁ。

normal: r64581 2018-08-28 09:24:08 +0900

構造体 rb_global_vm_lock_t のメンバー acquired を owner に改名しています。またこの構造体メンバーについての説明コメントをいくつか追加しています。

hsbt: r64582 2018-08-28 11:39:22 +0900

r64555 の rubygems の更新で lib/rubygems/installer.rb で RbConfig::TOPDIR が nil の場合(mswin でおきるらしい)のサポートを追加しています。 [ruby-core:88699] [Bug #15035]

ko1: r64583 2018-08-28 16:06:06 +0900

構造体 struct args_info にメンバー rest_dupped を追加して引数の処理する関数群で何度も args->rest の配列オブジェクトが dup されてたのを1回 dup したら余計な dup を抑制するようにする最適化と、配列の先頭N個をとりのぞいて後ろの要素を先頭に詰める rb_ary_behead() という関数を追加して args_rest_array() で rb_ary_subseq() のかわりに呼ぶようにしています。 rb_ary_subseq() と違って rb_ary_behead() は破壊的にオブジェクトを変更します。 [ruby-core:88555] [Feature #15010]

eregon: r64584 2018-08-28 18:41:26 +0900

rubyspec に再び upstream から最新版をマージしています。 ファイル末尾の改行が何度か追加されてた spec/ruby/language/fixtures/utf16-{be,le}-bom.rb は削除してこれも動的に生成するように対応しているようです。