ruby-trunk-changes 2020-11-25

今日は Ractor 利用時の Transient Heap の処理の修正や正規表現の \p{...} の記法の閉じかっこがなかった時のエラー処理がちゃんとされてなかった不具合の修正などがありました。

[b26d6c70e0] Jeremy Evans 2020-11-23 19:03:15 UTC

正規表現内の "\p{...}" の閉じかっこが無い場合のエラー処理が行なわれず例外が発生しなくなっていたのを修正しています。 [ruby-core:101028] [Bug #17340]

[b4dd7310ca] git 2020-11-24 15:01:57 UTC

version.h の日付更新

[490b57783d] Aaron Patterson 2020-11-24 18:45:12 UTC

GC.compact を明示的に呼び出した時に lock_page_body() と unlock_page_body() の処理を省略して対象の page の参照の禁止をしないようにしています。GC.compact の場合 compact 前に通常の GC を実行するようにしたので、それで不要になるということみたいですがよくわからず。

[87d21ee996] Aaron Patterson 2020-11-24 21:30:12 UTC

GC::INTERNAL_CONSTANTS という定数に格納されてる Hash に :HEAP_PAGE_SIZE という項目を追加しています。

[63ad55cd88] Aaron Patterson 2020-11-24 22:33:12 UTC

GC.auto_compact=true で GC の実行時に自動的に GC.compact も実行できるようになってましたが、mprotect(3) や VirtualProtect() によるメモリ領域保護が ruby で使っている heap の page サイズにマッチしない環境ではこれがうまくいかないので設定しようとすると NotImplementedError を発生させるようにしています。 [ruby-core:100715] [Bug #17306]

[26e3aea94f] Takashi Kokubun 2020-11-25 03:26:40 UTC

appveyor.yml で 7z による zlib のパッケージ解凍のオプションに -aoa というのを追加しています。

[c6b7b4f6f4] Takashi Kokubun 2020-11-25 03:50:41 UTC

Ractor のテストで CI でエラーになるものがあるそうで、デバッグのため失敗時の状況をもう少し詳しく出すよう assertion を書きかえています。

[eaa87be5f6] Takashi Kokubun 2020-11-25 04:18:04 UTC

c6b7b4f6f429d2cd3ea7a5ba38d2fc9f9037b91f で書きかえた Ractor のテストを環境変数 RUN_OPTS に --jit-min-calls=5 が含まれていた時にスキップするようにしています。

[00f046ef57] Takashi Kokubun 2020-11-25 04:36:25 UTC

test/unit の並列テスト時の worker の終了処理で例外を Exception#full_message でバックトレースつきで出力するようにしています。

[fed67fe6b2] Aaron Patterson 2020-11-25 05:29:45 UTC

490b57783d80f0c5f7882c66d9fb6aa02713c9a563ad55cd882e4010fe313d271af006a430b5ffa8GC.compact のための page 保護に関する変更を revert しています。なんでだろう。

[a79fe07db6] Koichi Sasada 2020-11-25 06:00:26 UTC

各 Ractor のメインスレッドの終了時に Thread#report_on_exception が true の時の例外出力の処理の前に rb_ractor_atexit_exception() の呼び出しがあったので後ろに移動しています。エラーが表示されるのを避けるためかなと思ったらコミットログをみるとこのために例外オブジェクトが他の Ractor と共有されてしまう可能性があったためこれを避けるためとのこと。

[d43d4acf26] Koichi Sasada 2020-11-25 06:51:31 UTC

Ractor.yield や Ractor#take の実装で Ractor のインスタンスを期待している引数が違うオブジェクトだった時の例外メッセージに対象のオブジェクトを inspect で文字列化して埋め込むようにしています。

[7aaf6676c4] Koichi Sasada 2020-11-25 07:14:01 UTC

オブジェクトの確保を一時的に保持する Transient Heap から ObjectSpace の heap に移動する transient_heap_evacuate() の先頭に rb_vm_barrier() を追加して複数 Ractor 利用時に全 Ractor の実行を一時止めるようにしています。RB_VM_LOCK_ENTER()/RB_VM_LOCK_LEAVE() で排他はすでにしているけどそれでは不足ということは transient_heap_evacuate() の内容を同時に実行してはいけないというだけではなくて他の Ractor が任意のオブジェクトを操作するのがだめということかな。