ruby-trunk-changes r65275 - r65303

今日は MJIT で inline cache や call cache に依存した JIT コードのコンパイルのために main thread から cache 内容をコピーしてもらって race condition を解決する修正や rubygems の最新版への更新などがありました。

k0kubun: r65275 2018-10-21 22:21:28 +0900

MJIT の JIT コンパイル時に ISeq の inline cache の情報をコピーするために struct mjit_copy_job という構造体を追加して、postponed_job_register() を使って main thread 側にコピーさせて MJIT の worker がその完了を待つようにして race condition を解消しています。これってこの直後にコンパイル中に Class の serial とかが更新された場合はどうなるんかな、と思ったけどそれは普通に JIT されたコードが cancel されるだけか。

k0kubun: r65276 2018-10-21 22:37:13 +0900

MJIT 用のコードのテンプレートとして tool/ruby_vm/views/_mjit_compile_send_guard.erb に分離されてた call cache の invalidate の処理が1箇所でしか使われなくなってたので直接展開するようにしています。

k0kubun: r65277 2018-10-21 22:45:36 +0900

構造体 struct rb_iseq_constant_body の cc_entries のコメントに書いてあった配列サイズについての記述の誤りを修正。

stomar: r65278 2018-10-21 23:02:00 +0900

標準添付ライブラリ mutex_m の Mutex_m の rdoc 用コメントが文法的に valid になるように修正しています。

k0kubun: r65279 2018-10-21 23:23:24 +0900

r65275 の inline cache と同様に call cache も MJIT の worker thread でコンパイル前に main thread にコピーさせたものを利用するようにして race condition を回避しています。

k0kubun: r65280 2018-10-21 23:30:18 +0900

r65279 にデバッグ用コードが混じってたそうで一部削除しています。

k0kubun: r65281 2018-10-22 00:29:01 +0900

NEWS ファイルの MJIT を有効にするオプションとして --enable=jit より --jit のほうを紹介するようにしています。将来的に MJIT がデフォルトで有効になったら --jit オプションは(警告を出すようにする期間の後)廃止する予定だそうですが、こっちのほうが短く書けるので便利ってことで。

svn: r65282 2018-10-22 00:29:02 +0900

version.h の日付更新。

aycabta: r65283 2018-10-22 00:33:30 +0900

Proc と Method クラスの rdoc 用コメントに説明やサンプルコードを追加しています。 [ruby-core:85600] [Bug #14483]

k0kubun: r65284 2018-10-22 00:41:00 +0900

r65281 の続きで NEWS ファイルの MJIT のエントリに configure の --disable-mjit-support オプションについても追記しています。

k0kubun: r65285 2018-10-22 00:54:50 +0900

r65279 の JIT コンパイル時の call cache の race condition の修正で不具合が直ったはずということで MJIT 有効時に skip するようにしていたテストを実行するように戻しています。

naruse: r65286 2018-10-22 01:37:24 +0900

addr2line.c の DWARF のセクション情報を選択する obj_dwarf_section_at() が構造体 obj_info_t のレイアウトに依存したマクロで定義されていたので inline 関数として定義して暗黙の前提を排除しています。

naruse: r65287 2018-10-22 01:42:23 +0900

addr2line.c の parse_debug_line_cu() で変数 is_stmt をヘッダの default_is_stmt で初期化しておくようにしています。うーむこのへんは DWARF 形式の中身がわかってないとよくわからない。

stomar: r65288 2018-10-22 05:00:46 +0900

標準添付ライブラリ net/http の rdoc 用コメントの整形。

naruse: r65289 2018-10-22 05:01:22 +0900

addr2line.c の DWARF 解析で VLIWアーキテクチャの検出をして解析をあきらめるようにしています。

k0kubun: r65290 2018-10-22 08:07:18 +0900

r65285 で MJIT 時の一部のテストの skip を消してましたが、そのうちさらに一部はまだエラーになることがあったみたいなので skip を戻しています。

k0kubun: r65291 2018-10-22 08:20:32 +0900

と思ったら r65290 を revert。 どうやら CI のエラーは別件によるものだと判断したようです。

k0kubun: r65292 2018-10-22 08:53:24 +0900

r65275 の MJIT での inline cache の参照の race condition 修正によって逆にエラーになってしまったテストを MJIT 有効時に skip するようにしています。一進一退って感じですね。

nobu: r65293 2018-10-22 08:53:39 +0900

test/ruby/test_time_tz.rb の Time の timezone 関係のテストを Time を継承したサブクラスを使うようにしています。ちょっと要点がわかってないけどテストメソッドを使いまわせるようにしてテスト対象にする zone を増やしてるっぽいです。

hsbt: r65294 2018-10-22 09:27:02 +0900

rubygems に upstream から最新版をマージしています。

hsbt: r65295 2018-10-22 09:32:16 +0900

拡張ライブラリ stringio の .gemspec ファイルの files と extensions に指定しているファイルパスを独立したリポジトリの時の相対パスに修正しています。

nobu: r65296 2018-10-22 10:25:29 +0900

Time::TM.new で引数を可変長にして 2つ目移行は省略可能にしています。そしてテストで Time::TM 使ってたところを Time にしてたりするんですが、この TM ってテスト用ってわけではないのか。

k0kubun: r65297 2018-10-22 12:31:13 +0900

もうひとつ Thread がらみのテストを MJIT 有効化時に skip するようにしています。

shyouhei: r65298 2018-10-22 12:59:48 +0900

.travis.yml の build matrix の pedanticism のビルド時に -O0 と -g0 のオプションは削るようにしています。最適化抑制すると遅くなりすぎてテストが Travis-CI で完走できないそうです。そんなに遅くなるんだ。

k0kubun: r65299 2018-10-22 18:40:44 +0900

r65275 で MJIT の worker thread で main thread に依頼した inline cache などのコピーのジョブの終了待ちしてるところで race condition があって既に ruby_cleanup() が実行されてて worker を止めようとしている状態だとコピーが行なわれずに待ち続けてしまってデッドロックになる不具合があったので、copy_cache_from_main_thread() で rb_postponed_job_register() の戻り値のチェックと worker_stopped フラグのチェックを追加して、ジョブの依頼が失敗してたら待ちに入らないように修正しています。

k0kubun: r65300 2018-10-22 18:48:35 +0900

r65299 で MJIT worker の停止フラグが立ってるかどうかのチェックを worker_stopped のほうをみてたのを、停止の指示をするほうの stop_worker_p のほうをチェックするように修正しています。

k0kubun: r65301 2018-10-22 18:53:00 +0900

r65299 および 65300 の再修正で、コピー成功したかどうかのフラグ用に success_p という変数を追加してましたが、main thread 側でコピー完了後に struct mjit_copy_job の finish_p に TRUE をセットするようになってたので、それを参照すれば良かったということで変数は削除しています。

knu: r65302 2018-10-22 20:23:56 +0900

Enumerator#each に引数が渡されてた時に返す Enumerator の size メソッドは nil を返すようにしています。Enumerator#each に引数が渡された時はサイズが不明になるので、とのことだけどそもそも Enumerator#each に引数が渡された時って何が起きるんだっけ? と思ったら rdoc にサンプルが書いてあって元の each が yield したものに追加されるんですね。

svn: r65303 2018-10-22 20:23:57 +0900

r65302 のインデントのタブを空白に展開。