ruby-trunk-changes 2020-12-18

今日は拡張ライブラリ socket, strscan, openssl, zlib などを Ractor safe に宣言する変更や finalizer の処理が Ractor 間で競合する可能性があった不具合の修正などがありました。

[caef364cc5] Yusuke Endoh 2020-12-17 13:39:37 UTC

9908177857a28633d6279c43a1ad4dfedcb98596 の続きでまだいくつか警告が出てたテストの対応を追加しています。

[6538c89f1c] Koichi Sasada 2020-12-17 16:19:03 UTC

GC 中の状態のチェックのための関数 gc_verify_internal_consistency() に rb_vm_barrier() を追加して全 Ractor を一時停止させるようにしています。

[f7a6b460d5] git 2020-12-17 16:20:56 UTC

version.h の日付更新

[81739ad4fd] Radosław Bułat 2020-11-09 10:25:11 UTC

Module#public、Module#protected、Module#private などのメソッドで引数に配列で Symbol や String を受け取れるようにしています。また Module#attr_xxx 系のメソッドや Module#alias_method で定義したメソッド名を示す Symbol の配列を返すようにして、1文でまとめて private attr_reader :xxx のように書けるようにしています。 [ruby-core:100763] [Feature #17314]

[895b10ad02] Aaron Patterson 2020-12-17 21:25:35 UTC

GC.compact の rdoc 用コメントを追加しています。 [ruby-core:96395] [Misc #16443]

[29e42b8bfd] Koichi Sasada 2020-12-17 23:25:24 UTC

gc_enter() で既に during_gc が真だった時の assertion を GC_ASSERT() を使ってたのを rb_bug() を呼び出すようにしています。 CI で問題が起きてるのでデバッグモードでなくても異常終了させるようにしてるのかな。

[51c2725dc6] Koichi Sasada 2020-12-18 00:12:26 UTC

Regexp のテストで警告が出ることを確認するためのテストで正規表現リテラルが freeze されて同じリテラルが毎回同じオブジェクトになるようになったため最初の 1回しか警告が出ないために失敗するという問題があったようで、Kernel#eval で正規表現リテラルを評価することで毎回新しいオブジェクトを作るようにしています。

[aa82b067cb] 卜部昌平 2020-12-18 02:18:09 UTC

include/ruby/internal/interpreter.h に既に存在しない ruby_set_stack_size() の prototype 宣言が残ってたので削除しています。

[a07f249803] Koichi Sasada 2020-12-18 02:23:16 UTC

拡張ライブラリ socket の Init_socket() の先頭で rb_ext_ractor_safe() を呼んで socket は Ractor safe だと宣言するようにしています。 182fb73c40351f917bf44626c44c1adb6cb1aa5a で追加された C API で main Ractor 以外でも socket の提供するメソッドを使えるようにするためですね。

[66090b9d10] Nobuyoshi Nakada 2020-12-18 03:10:20 UTC

81739ad4fdfcc86a769056fec352f27c686fba1b で rb_mod_attr_writer() および rb_mod_attr_accessor() で戻り値のために Symbol を作るのに rb_sprintf() で文字列オブジェクトを生成してたのをやめて ID2SYM() で取得するように効率化しています。

[e042e8460b] Nobuyoshi Nakada 2020-12-18 03:59:01 UTC

Module#public, #protected, #private と #alias_method の基本的テストがなかったので追加しています。また vm_method.c のスタイルの修正。

[34f0606217] Nobuyoshi Nakada 2020-12-18 04:03:22 UTC

81739ad4fdfcc86a769056fec352f27c686fba1b の Module#public, #protected, #private, #alias_method についてのテストをさらに追加しています。 [ruby-core:100763] [Feature #17314]

[0e40cc9b19] Hiroshi SHIBATA 2020-12-18 03:13:33 UTC

rubygems の 3.2.2 と bundler の 2.2.2 を upstream からマージしています。

[b44f7151c7] Koichi Sasada 2020-12-18 02:37:13 UTC

拡張ライブラリ zlib の Init_zlib() にも rb_ext_ractor_safe() の呼び出しを追加して Ractor safe にしています。

[8cba3b35e0] Hiroshi SHIBATA 2020-12-18 05:11:50 UTC

NEWS の rubygems と bundler のバージョンの記述を更新しています。

[cfa124ef05] Koichi Sasada 2020-12-18 05:14:40 UTC

6538c89f1c9d1af95c0fb3e58ac0e807a5fe47f4 で rb_vm_barrier() を追加した gc_verify_internal_consistency() ですが、VM 全体のロックを取得してから呼ばれることを期待していましたが実際にはロックせずに呼ばれる場合があったそうで RB_VM_LOCK_ENTER()/RB_VM_LOCK_LEAVE() によるロックを追加しています。 RB_VM_LOCK_ENTER() はネストしたロック取得を許容するので既にロック取得していても大丈夫。

[985f0af257] Kenta Murata 2020-12-17 09:29:21 UTC

拡張ライブラリ strscan でも rb_ext_ractor_safe() の呼び出しを追加して Ractor safe だと宣言するようにしています。また子 Ractor から strscan のメソッドを使うテストも追加しています。

[5370963992] Kenta Murata 2020-12-17 09:32:08 UTC

拡張ライブラリ strscan のバージョンを 3.0.0 に更新しています。

[b5de66e132] Kenta Murata 2020-12-17 13:40:26 UTC

拡張ライブラリ strscan の ext/strscan/strscan.c のヘッダ部分のコメントのライセンスの表記を Ruby's から Ruby's または 2-claus BSD License の dual license に変更しています。

[f0ec923c58] Takashi Kokubun 2020-12-18 05:36:06 UTC

e53c0bc906c514ca6f0d40e2140dee1e23b4591eGitHub Actions の MJIT テスト用の workflow でテスト時のオプションに追加した --jit-save-temps を削除しています。SEGV 時のバックトレースを得るために付けたそうですが効果がなかった模様。

[ffc8a72f39] Kazuhiro NISHIYAMA 2020-12-18 05:59:20 UTC

NEWS.md のチケット番号のリンクのための footnote をチケット番号でソートしなおしています。

[8e03e3b0ba] Nobuyoshi Nakada 2020-12-18 06:09:55 UTC

parse.y の一行メソッド定義の文法のアクション部で token_info_drop() を呼び出してたのを endless_method_name() という関数の中に移動して、def x.meth = ... のように特異メソッド定義時のルールで抜けてたのを修正しています。

[0a60ba923e] Yusuke Endoh 2020-12-18 05:12:09 UTC

ここから 81739ad4fdfcc86a769056fec352f27c686fba1b の public/protected/private や alias_method、 attr_xxx の仕様変更を revert するための関連 commits の revert が続きます。 34f06062174882a98ebef998c50ad8d4f7fc0f2e のテスト追加を revert。

[41c208d4a4] Yusuke Endoh 2020-12-18 05:12:38 UTC

66090b9d10cdaed917b525225e59d1c19e399248 の文字列オブジェクト生成を抑制する効率化も revert。

[982443e6e3] Yusuke Endoh 2020-12-18 05:12:42 UTC

81739ad4fdfcc86a769056fec352f27c686fba1b の public/protected/private、attr_xxx と alias_method の仕様変更を revert しています。 [ruby-core:100763] [Feature #17314]

[763d5f9c6b] Nobuyoshi Nakada 2020-12-17 04:49:10 UTC

GC の設定をする環境変数のうち RUBY_FREE_MIN と RUBY_HEAP_MIN_SLOTS は既に deprecated で警告を出していたので、単に無視するように変更しています。

[75416b8628] Nobuyoshi Nakada 2020-12-17 04:50:08 UTC

GC.stat で返す Hash のキーのうち既に値がセットされず互換性のため? にキーだけ残されてたものを削除しています。

[61236770e6] Koichi Sasada 2020-12-18 08:49:22 UTC

gc_finalize_deferred() も Ractor 間で競合する可能性があったので RB_VM_LOCK_ENTER()/RB_VM_LOCK_LEAVE() でロック取得するようにしています。

[7d32bf7853] Nobuyoshi Nakada 2020-12-18 08:56:08 UTC

61236770e6cc41f1364dc04249d845def03d9f37 で冗長な変数宣言が追加されてしまってたので削除しています。

[74ab2c3b46] Koichi Sasada 2020-12-18 08:59:26 UTC

61236770e6cc41f1364dc04249d845def03d9f37gc_finalize_deferred() に追加した VM ロック取得は finalilzing フラグの変数をセットした後に取得するようにします。このフラグ設定は ATOMIC_EXCHANGE() を使ってるので排他しなくても良いし、既に finalizing が真だった時にロックを解放せずに return してしまってたのでロックのリークの不具合がありました。

[b5588edc0a] Koichi Sasada 2020-12-18 09:19:33 UTC

拡張ライブラリ openssl の Init_openssl() にも rb_ext_ractor_safe() の呼び出しを追加して Ractor safe にしています。ただし OpenSSL::BN の実装が ossl_bn_ctx というグローバル変数の構造体を共有していたので、これを Ractor local storage で Ractor 毎に確保するように修正しています。がっつり 3.0 の C API に依存してるので古い ruby ではビルドできなくなってますね。