ruby-trunk-changes 2020-11-28

今日は主に MJIT の JIT コードの入れ替えの頻度を落としてオーバーヘッドの大きい処理を頻繁に実行してしまわないようにするチューニングや、特殊変数 $KCODE の削除などがありました。

[039ba387aa] Nobuyoshi Nakada 2020-11-27 12:36:12 UTC

2db2fb9f6c742d5bd0019ccd11c7a375e1b12c0b の Ractor 毎の乱数生成器のための構造体 rb_random_t を void* の型で取り回してたのを struct にタグをつけて内容は不可視な構造体ポインタとして扱うように修正しています。

[f0bfa266d7] Benoit Daloze 2020-11-27 13:55:29 UTC

spec/mspec に upstream からマージしています。

[f02d2f82bf] Benoit Daloze 2020-11-27 13:55:31 UTC

spec/ruby に upstream からマージ。

[ddb1736bfc] Benoit Daloze 2020-11-27 14:47:17 UTC

spec/ruby に upstream から再度マージ。

[16dab6b692] Takashi Kokubun 2020-11-28 05:28:57 UTC

MJIT が JIT コンパイル対象のコードを単一の C ソースコードにまとめて 1つの共有ライブラリにビルドする処理(GC.compact とまぎらわしいですが JIT compaction と呼ばれている)の処理の途中に JIT コードをメモリ上から外す unload_units() の処理を避けるようにしていたのを、unload_units() の実行を mjit_worker のスレッド側で実行するようにして競合しないようにしています。このため mjit.c から関連する関数を mjit_worker.c に移動しています。JIT compaction 中であることを示す in_compact 変数は削除して、かわりに unload 処理の要求を示す unload_units_p という変数を追加してスレッド間の通信のために使っています。

[46a49536e3] git 2020-11-28 05:39:27 UTC

version.h の日付更新

[12866b0d31] Takashi Kokubun 2020-11-28 05:52:22 UTC

MJIT の JIT compaction 処理を行う compile_compact_jit_code() でまとめようとしてた rb_mjit_unit の ISeq が GC で回収済みだった場合にデバッグログを出力するようにしています。

[d80226e7bd] Takashi Kokubun 2020-11-28 06:07:02 UTC

unload_units() で JIT コードから外す rb_mjit_unit を選ぶロジックを変更して、呼び出し回数で下位10%をかならず外すようになってたのを充分な呼び出し回数があれば外さないようにしています。

[276f6a225d] Jeremy Evans 2020-11-27 05:16:19 UTC

Time.new の秒のところに Rational を渡してさらに timezone を指定するオブジェクトも渡した時のテストを追加しています。コミットログをみると Time.new の不具合修正っぽいんですけどこのコミットではテストメソッドの追加だけで、修正は次の 95bef7b69a6fb42687a6200b338060be307259f5 に分離されてそうですね。

[95bef7b69a] Nobuyoshi Nakada 2020-11-27 07:13:42 UTC

ということで 276f6a225d18561cbe5282b798cb4e416c66079f で追加したテストに対応する(?) Time.new の修正です。

[122cd35939] Takashi Kokubun 2020-11-28 06:46:01 UTC

d80226e7bd801fcbccf71f19ba373b7baf71a49e で MJIT の JIT コードをメモリ上からはずす unload 処理の基準を変更したため外されにくくなって unload_units() の呼び出しがより頻繁になると考えられるので、実際に処理するのを cache サイズ / 10 の回数ごとにまで間引くようにしています。

[2a7e858617] Takashi Kokubun 2020-11-28 07:13:17 UTC

122cd35939ddf8ef7bfa17ad75570c01d0cf06ab の MJIT の unload_unit() 呼び出しの頻度変更に対応してテストを修正しています。

[096f54428d] Takashi Kokubun 2020-11-28 07:25:31 UTC

MJIT の JIT compaction もコストが高いのであまり頻繁に実行してしまわないようにしています。

[3378a1ccef] Takashi Kokubun 2020-11-28 07:46:10 UTC

096f54428d8000cccce430022784cb0e7cd31cb4 による MJIT の JIT compaction の頻度変更にテストを追随させています。

[95edb3ec10] Takashi Kokubun 2020-11-28 08:17:55 UTC

GitHub Actions の MJIT テスト用の workflow でタイムアウトを伸ばしています。

[14453a256d] Lars Kanis 2020-11-26 10:15:37 UTC

Windows 環境で環境変数を取得するのに getnev() ではなく w32_getenv() という API を直接利用するようにしています。元々マクロで w32_getenv() を呼ぶようになってましたが、codepage の指定の引数 cp が暗黙のうちに渡されるようになっていてわかりにくいのでそれをやめようということみたいです。

[3db21cf25f] Nobuyoshi Nakada 2020-11-28 09:39:57 UTC

14453a256d58b11b06d432e2a4388d95aac298d6 の続きで win32/win32.c で getenv() を w32_getenv() を使うように書きかえるマクロ定義を削除してたのを復活させています。 win32/win32.c は dln_find.c を #include していて、この中の getenv() も差し替えるためにこのマクロは必要だったそうです。dln_find.c の中の getenv() も書きかえるわけにはいかないのかな。

[85aabef023] Nobuyoshi Nakada 2020-08-31 13:13:34 UTC

特殊変数 $KCODE は既に obsoleted になっていて代入や参照すると警告が出るようになってましたが、それも消してただのグローバル変数として扱われるようにしています。 [ruby-core:99785] [Feature #17136]