ruby-trunk-changes 2020-12-07

今日は Ractor 有効化時に Transient Heap を使わないようにするなど Ractor 関連の排他処理による性能の問題への対処や、Socket.getaddrinfo で getaddrinfo_r(3) を使って割り込み可能にするのをあきらめて戻す変更などがありました。

[14580ebef9] Nobuyoshi Nakada 2020-12-06 13:19:36 UTC

gems/bundled_gems の rbs のバージョンを 0.20.0 に更新。

[51500eedef] Kenta Murata 2020-12-04 06:50:13 UTC

Memory View 機能の C API に memory_view_extract_item_members() というのを追加してポインタと rb_memory_view_item_component_t による内容の型の指定を受け取ってデコードした要素のオブジェクトの配列を返すことができるようにしています。

[1a76bb56b0] Kenta Murata 2020-12-06 14:24:45 UTC

51500eedefa492699668ced3e07e330a9a4d53ee で追加した rb_memory_view_extract_item_members() の prototype 宣言の引数に const を追加。

[e427c5cc2a] Nobuyoshi Nakada 2020-12-06 14:47:49 UTC

gems/bundled_gems の rbs のバージョンを 0.20.1 に更新しています。

[ce707079c1] Kenta Murata 2020-12-06 15:18:55 UTC

51500eedefa492699668ced3e07e330a9a4d53ee で追加した rb_memory_view_extract_item_members() の変数の初期化を追加。

[f9fd99e601] git 2020-12-06 15:19:45 UTC

version.h の日付更新

[60eabb1aa7] Kenta Murata 2020-12-06 15:32:29 UTC

51500eedefa492699668ced3e07e330a9a4d53ee で追加した rb_memory_view_extract_item_members() をやっぱり削除しています。なにか問題があったのかな。

[b67b24d0f5] Koichi Sasada 2020-12-01 18:37:56 UTC

Ractor を使ってるかどうかを変数 ruby_multi_ractor というので判定するようにしてたのを、bool ではなくて Ractor が 1つだけの時にその Ractor を指す ruby_single_main_ractor というポインタをグローバル変数として持っておくことで判定するようにしています。子 Ractor を作るとこの変数は NULL が代入されて複数あることを示すようになるようです。

[307732ccee] Koichi Sasada 2020-12-04 21:15:17 UTC

Ractor を使うと Transient Heap を扱うために排他をする必要があってパフォーマンスの低下に繋がるので、Ractor を作ると Transient Heap を使うのはやめるようにしています。なるほどー。Ractor を作った時には cancel_single_ractor_mode() という関数が呼ばれてそこで rb_transient_heap_evacuate() が呼ばれて確保中の Transient Heap はその時点ですぐに ObjectSpace に移動されるようにするみたいです。これにあわせて Transient Heap の実装で既に追加されてた Ractor 間のロックのための RB_VM_LOCK_ENTER()/RB_VM_LOCK_LEAVE() は削除しています。

[23f9447429] Koichi Sasada 2020-12-04 20:38:50 UTC

ruby_debug_log() で複数 Ractor を使ってるかどうかの判定に b67b24d0f5e78481e6a306881b6858f0dec996ba で追加した ruby_single_main_ractor を参照するようにしています。

[554a7180a0] Koichi Sasada 2020-12-01 19:10:05 UTC

Ractor 間の排他を行う RB_VM_LOCK_ENTER_LEV()/RB_VM_LOCK_LEAVE_LEV() に引数に current ractor を明示的に渡す RB_VM_LOCK_ENTER_CR_LEV()/RB_VM_LOCK_LEAVE_CR_LEV() というのを追加しています。

[1d0bf3d8dd] Koichi Sasada 2020-12-04 20:42:44 UTC

vm_lock_enter() にデバッグログを追加しています。

[91d99025e4] Koichi Sasada 2020-12-03 06:57:39 UTC

Ractor 利用時にオブジェクト確保する時に page の空き slot をまとめてその Ractor 専用の free list として予約してしまってオブジェクト確保時に毎回 VM 全体の排他処理をしなくて済むようにしています。 GC したとき には free list の予約は解消して取り直すようにしているようです。

[59ddb88da6] Koichi Sasada 2020-12-06 06:40:16 UTC

RB_NEWOBJ_OF() に rb_execute_context_t を指定する引数を追加したバージョンの RB_EC_NEWOBJ_OF() というマクロを追加しています。 パフォーマンスのために可能なら GET_EC() を省くためですかね。

[344ec26a99] Koichi Sasada 2020-12-06 06:41:21 UTC

VM 命令の putstring と newarray で呼ぶ関数に rb_execute_context_t を渡すバージョンを使うようにする最適化。 59ddb88da6bf483eeec7b85b8a85cf3719edf440 で追加したマクロ RB_EC_NEWOBJ_OF() を利用しています。やはりパフォーマンスのためだったようです。

[bef3eb5440] Koichi Sasada 2020-12-06 15:07:30 UTC

b67b24d0f5e78481e6a306881b6858f0dec996ba で追加した ruby_single_main_ractor という変数の定義を ractor.c から vm.c に移動しています。 MJIT のために必要だったとのこと。また prototype 宣言に extern を直接使ってたのを RUBY_EXTERN マクロを利用するようにしています。

[8dd03e5cf0] Koichi Sasada 2020-12-07 02:10:18 UTC

gc_verify_internal_consistency_() という GC 時のデバッグのための一貫性チェックで生きてる slot の数のカウントのチェックを Ractor 利用時にも実施しないようにしています。おそらく 91d99025e4776885ceea809123a129cb31cd1db6 の Ractor 毎の free list の導入で一致しなくなることがあるようになったからでしょうね。

[0ebf6bd0a2] Koichi Sasada 2020-12-07 02:27:25 UTC

vm_lock_enter() に no_barrier という引数を追加して全 Ractor の処理を一時止める barrier はなしでロックだけするということができるようにしています。またこれを利用するためのマクロ RB_VM_LOCK_ENTER_NO_BARRIER()/RB_VM_LOCK_LEAVE_NO_BARRIER() を追加しています。

[4b4af40f55] Yusuke Endoh 2020-12-07 02:57:27 UTC

gems/bundled_gems の typeprof のバージョンを 0.9.0 に更新しています。 https://github.com/ruby/ruby/pull/3856

[556a728508] Takashi Kokubun 2020-12-07 04:23:19 UTC

compile_compact_jit_code() で compile unit のリストをループする時に CRITICAL_SECTION_START()/CRITICAL_SECTION_FINISH() でリストの要素を辿る瞬間だけ排他するようにしています。 mjit_recompile() での remove_from_list() と競合していた模様。

[1ba05f5b2d] Koichi Sasada 2020-12-07 04:32:20 UTC

obj_free_object_id() で VM 全体の排他をする範囲内に T_ZOMBIE 型オブジェクトの時の処理も入れています。

[5d8bcc4870] Masaki Matsushita 2020-12-07 03:49:44 UTC

2038cc6cab6ceeffef3ec3a765c70ae684f829ed で拡張ライブラリ socket の名前解決で getaddrinfo_a(3) を使うようにした結果 fork がうまく動かなくなったので 94d49ed31c39002335eeee65d42463139f561954 やその後の変更で背後で動いてる thread をキャンセル するようにしましたが、確実に終了したのを待つ方法がなくて fork 前に常に 1.5秒 sleep するようになってしまっていたのですが、さすがにこれは許容できないということで rb_getaddrinfo_a() を利用するようにする変更を revert して rb_getaddrinfo_a() の実装も削除しています。 [Bug #17220] [Feature #17134] [Feature #17187]

[cc36e499f9] 卜部昌平 2020-12-07 03:37:18 UTC

ruby_xmalloc()/ruby_xcalloc()/ruby_xrealloc()/ruby_xrealloc2()/ruby_xfree() などの Doxygen 用のコメントで確保したメモリ領域のことを指す語彙を object instance から storage instance に変更しています。 N2328 という文書で C 2x の語彙を決める提言がされてたみたいです。 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2328.pdf

[c2fa024e02] Koichi Sasada 2020-12-07 07:01:35 UTC

Ractor#yield や Ractor#take の実装で Thread で割り込みが発生した時に rb_ractor_t::wait::wakeup_status が変化するのを考慮していなかったようなのでそれを修正して wakeup_none にリセットするようにしています。 [ruby-core:101246] [Bug #17366]

[53ce71b5af] Marc-Andre Lafortune 2020-12-05 05:04:48 UTC

Ractor.select で引数の Ractor の指定がなくてキーワード引数 yield_value も指定されてなかったら ArgumentError 例外を発生させるようにしています。

[547c71dec4] 卜部昌平 2020-07-27 01:19:58 UTC

Hash#index (Hash#key と同等)は deprecation warning が出る状態になってたので削除しています。

[20d53dad47] Nobuyoshi Nakada 2020-12-06 14:37:21 UTC

547c71dec47561571b4862dda0395fb0b08d6c1c の Hash#index の削除に追随して……というわけではなく rubyspec のHash#index のテストの ruby_version_is による guard がまだ 2.8 だったので 3.0 に修正しています。

[7817a438eb] Nobuyoshi Nakada 2020-12-02 06:50:01 UTC

Time#succ も derecated になっていたので削除しています。

[29dee10af2] Nobuyoshi Nakada 2020-12-07 10:09:23 UTC

tool/rbinstall.rb の load_gemspec に第2引数 expanded を追加してこれが true に指定されると spec.files に動的に配下のファイルを追加するようにしています。gemspec ファイルの spec.files に不足があっても展開して出てきたファイルは全てインストールするためかな。