ruby-trunk-changes r63212 - r63226

今日はマルチスレッド時の IO の race condition 修正やオブジェクト型チェックの VM 命令最適化などがありました。

k0kubun: r63212 2018-04-20 22:42:08 +0900

MJIT のコード生成用のテンプレート tool/ruby_vm/views/_mjit_compile_send.erb からメソッドキャッシュが効いてない時のチェック部分を tool/ruby_vm/views/_mjit_compile_send_guard.erb というテンプレートに切り出して、attr_reader によるメソッドのインライン化に対応する最適化。

normal: r63213 2018-04-21 06:38:27 +0900

シグナル処理時に使うマシンスタックを別途用意する signaltstack の確保を Init_heap() から rb_register_sigaltstack() に移動しています。確保と登録が別の場所でされてたので readability のためにまとめた、とのことなのでリファクタリングですかね。 [ruby-core:85621] [Feature #14487]

svn: r63214 2018-04-21 06:38:28 +0900

version.h の日付更新。

normal: r63215 2018-04-21 07:53:37 +0900

r62934 の Queue や Mutex の構造体を fork 時に初期化する変更を再度入れています。 これ revert されたんでしたっけ。 [ruby-core:86316] [Bug #14634]

normal: r63216 2018-04-21 12:12:36 +0900

fd を close() した時にその fd の IO 処理でブロックしている Thread に通知する rb_notify_fd_close() で close(2) から通知までの間に Thread 切り替えの発生しうる rb_thread_schedule() を呼ばないようにしています。 fd は close() で解放されてすぐに別の IO のために再利用される可能性があるため、ここでコンテキストスイッチが起きると開いたばかりの別の fd に対して close の通知が行ってしまう可能性があったようです。

normal: r63217 2018-04-21 13:02:41 +0900

r63216 の変更に対応したテストの追加。

kou: r63218 2018-04-21 15:18:08 +0900

標準添付ライブラリ rexml の XPath parser のテストに書いている XML のインデントや改行などの体裁を修正。

kou: r63219 2018-04-21 15:21:02 +0900

標準添付ライブラリ rexml のテストで assert_raise に例外クラスが指定されていなかったのを指定するようにしています。

kou: r63220 2018-04-21 15:21:41 +0900

標準添付ライブラリ rexml のテストで変数名の変更。

kou: r63221 2018-04-21 15:39:43 +0900

標準添付ライブラリ rexml の REXML::Functions.string で引数の object が nil の時の対応を強化しています。

kou: r63222 2018-04-21 15:43:58 +0900

標準添付ライブラリ rexml の REXML::Functions.concat の実装で各要素を REXML::Functions.string を使って文字列化するように修正しています。

kou: r63223 2018-04-21 15:45:42 +0900

標準添付ライブラリ rexml のテストでメソッド名を _test_xxx と先頭に "_" をつけてテストメソッドとして実行されないようにしていたメソッドの一部を test_xxx と変更して実行されるようにしています。

nobu: r63224 2018-04-21 16:48:36 +0900

compile.c のマクロ INSERT_BEFORE_INSN() と INSERT_BEFORE_INSN1() の引数名を変更しています。

nobu: r63225 2018-04-21 19:52:52 +0900

r59950 で追加された VM 命令の branchiftype という命令を廃止して、かわりに checktype というオブジェクトの型をチェックする命令を追加して checktype と branchif 命令の組み合わせを使うように変更しています。条件の反転を可能にする最適化(?)を可能にするためだそうです。ただ ISeq の命令数は増えますね。

nobu: r63226 2018-04-21 19:52:53 +0900

r63225 の branchiftype の checktype と branchif への分割を利用した最適化? でチェック対象のオブジェクトの型があらかじめわかっていたら checktype を省略して jump 命令に変更するようにしています。ふーむ、しかしこれなら branchiftype のままでも最適化できそうですけど。