ruby-trunk-changes 2020-12-10

今日は webrick を標準添付ライブラリから外す変更や Ractor 利用時のメモリ管理の調整、MJIT の linked list 管理の不具合修正などがありました。

[3156fb0f2c] Yusuke Endoh 2020-12-09 15:16:49 UTC

fad3023e94c45e7f03478732f7641b6f39ba9d12 で同じテストメソッドを 2つ追加してしまっていたので 1つ削除しています。 [ruby-core:100312] [Bug #17218]

[549118b3e2] git 2020-12-09 15:17:44 UTC

version.h の日付更新

[bb489aca58] Kenta Murata 2020-12-09 15:24:36 UTC

Memory View 機能の C API に rb_memory_view_get_item() と rb_memory_view_prepare_item_desc() という関数を追加しています。 MemoryView のオブジェクトからインデックス指定で要素を取り出す関数と format 文字列を解釈して構造体にセットさせる関数のようです。ヘッダファイルの prototype 宣言で関数名が typo していますね。 https://github.com/ruby/ruby/pull/3871

[2544f7196e] Kenta Murata 2020-12-09 15:58:44 UTC

3156fb0f2c3ebf8229f392c8502c08fe165ab181 で削除した Range#step のテストメソッド test_last_bug17218 は内容は違ってたので名前を変更して復活させています。

[eafe000af3] Koichi Sasada 2020-12-10 01:28:53 UTC

GC の Lazy Sweep で sweep 処理を継続する量を sweep した slot 数を元に制御するようにしています。元は page 単位でやめてたのを、充分 sweep してなかったら継続するようにしているので基本的に sweep をより多くするようにしています。 Ractor を使った時に sweep を小刻みにすると排他処理のためのオーバーヘッドが大きいのでそれを避けるためみたいです。

[554c094977] Koichi Sasada 2020-12-10 01:38:30 UTC

GC で heap 全体のうちどの程度空き slot を確保しておくかの min_free_slots と max_free_slots の計算に Ractor 数を掛ける(最大で 8倍まで)ようにして、より多めに slot を確保するようにしています。ObjectSpace は共有するものの Ractor は基本的に別々のオブジェクト群を使うので、Ractor が複数あるということは必要なオブジェクト数もそのぶん増えるはずなので、ということみたいです。

[da3bca513f] Koichi Sasada 2020-12-10 01:58:25 UTC

91d99025e4776885ceea809123a129cb31cd1db6 で Ractor 毎に ObjectSpace の slot を予約して VM 全体のロックをオブジェクト確保の都度行なわなくても良いようにしてましたが、さらに複数 page にまたがってキャッシュを持てるようにしています。 1 Ractor あたり 512 slots まで持てるようにしています。 https://github.com/ruby/ruby/pull/3842

[16c765990c] Takashi Kokubun 2020-12-10 08:17:59 UTC

MJIT で JIT unit の管理に使ってる ccan/list の list_for_each() のループ内で list_del() を呼ぶのはまずかったようなので list_for_each_safe() というマクロを使うように修正しています。

[12a1a25181] Takashi Kokubun 2020-12-10 08:21:33 UTC

3319ce37651aa7e50c31b5fba14871938318b37a の struct rb_mjit_unit のメンバーの移動のリトライ。おそらく 16c765990ceaf5fb1efaeba2850083cfec7c137e で list_for_each_safe() を使うようにしたことにより SEGV が直せたということではないかと思います。

[9e8f732f39] Takashi Kokubun 2020-12-10 08:21:59 UTC

b7dc04e51823f9fe8b5355c30a304ecdb11fe5ed で compile_compact_jit_code() のロックまわりの変更を revert してたのを復活させています。これも list_for_each_safe() を使うことで謎の SEGV が直ったからかな。

[46d3ea2c25] 卜部昌平 2020-12-10 08:41:39 UTC

GitHub Actions でコンパイラオプションや BASERUBY のバージョンの網羅など workflow が大量になってたものを減らすためコメントアウトしています。 https://github.com/ruby/ruby/pull/3876

[5dc786bf86] Hiroshi SHIBATA 2020-11-02 04:44:28 UTC

標準添付ライブラリ webrick を lib/webrick から tool/lib/webrick に移動してテスト用のツールという立ち位置で同梱するように変更しています。標準添付ライブラリ(default gems)からは外して bundled gems にするということですね。

[087ac34fb2] Hiroshi SHIBATA 2020-11-02 07:48:20 UTC

make test-spec の実行時の $LOAD_PATH に tool/lib を含めるようオプションを追加しています。

[0e73b49b4c] Hiroshi SHIBATA 2020-11-02 10:57:27 UTC

doc/standard_library.rdoc や doc/maintainers.rdoc でも webrick の記述セクションを default gems から bundled gems として移動して gems/bundled_gems に追加しています。

[880727f037] Hiroshi SHIBATA 2020-11-02 11:02:12 UTC

webrick の bundled gems 化により標準添付ライブラリ un.rb で require "webrick" が失敗した時の対応を追加しています。

[b084f8abcf] Hiroshi SHIBATA 2020-11-02 22:11:40 UTC

bundled gems からも webrick を削除しています。

[4ccc66265c] Hiroshi SHIBATA 2020-11-02 22:14:36 UTC

rubygems で gem server で webrick を起動する時にその時点で require "webrick" するように遅延させて、さらに webrick がなかった時に gem install webrick するように促すメッセージを表示するようにしています。

[e7433a3288] Hiroshi SHIBATA 2020-12-10 07:20:21 UTC

標準添付ライブラリ rdoc でも webrick を使う時に webrick がなかったら gem install を促すメッセージを出力して終了するようにしています。

[9a17437558] Lourens Naudé 2019-11-26 13:07:49 UTC

正規表現の compile 後に確保していたバッファの余計な部分を削るため xrealloc() でメモリ領域を確保しなおして必要なサイズに切り詰めておくようにしています。正規表現リテラルは作られた正規表現オブジェクトがずっと残るので余分なメモリ領域がもったいないからでしょうね。

[142f154a0a] Nobuyoshi Nakada 2020-12-10 09:16:15 UTC

da3bca513f437b05b3953c3712ff48621fc5e008 で Ractor 毎のオブジェクトの slot のキャッシュを増やしたところで page->freelist の asan_unpoison_memory_region() の呼び出しが不足していて異常終了になってたのを修正。

[7856da5fe7] "NARUSE, Yui" 2020-12-09 08:41:21 UTC

パッケージの情報をリリースノートに貼りつける形式に整形する tool/format-release で .bz2 フォーマットの情報の出力を削っています。3.0 から(だっけ) .bz2 のリリースはやめているので。

[72f1c43584] Koichi Sasada 2020-12-10 04:27:08 UTC

Ractor を使っていると Ractor 間で特に共有するように指定されたオブジェクトでないと共有できないのですが、ObjectSpace._id2ref を使うと id から任意のオブジェクトの参照を得ることができてしまうので、複数 Ractor 起動後に shareable でないオブジェクトを取り出そうとした時には RangeError 例外が発生するようにしています。 RangeError なのか。

[658b4ff609] Hiroshi SHIBATA 2020-12-10 09:55:03 UTC

4ccc66265cdef0480eb6ff46f6be9f8de1a01891rubygems での webrick 利用時の対処の再修正。チェックを Gem::Server.run で行なってたのを Gem::Server#initialize 内に移動しています。実際に使うメソッド内でチェックするようにしています。