ruby-trunk-changes 2020-09-04

今日はなんといってもお待ちかねの並列化機構 Ractor がコミットされました。

[79df14c04b] Koichi Sasada 2020-03-09 17:22:11 UTC

みなさんお待ちかねの新しい並列化機構 Ractor がコミットされました。 [ruby-core:99449] [Feature #17100]
Ractor については今日 RubyKaigi takeout でささださんが解説したセッションがあったので、そのうちアーカイブも公開されると思うので RubyKaigi の YouTube チャンネルに登録しておきましょう。 https://www.youtube.com/channel/UCBSg5zH-VFJ42BGQFk4VH2A/featured
ざっくりと見所を探していくと、まず ractor.h で構造体 rb_ractor_t が定義されていて、この内容は Thread とか Fiber の構造体とはだいぶ違ってて内部に rb_thread_t と rb_execution_context_t を管理してる linked list があってあとは IO やオブジェクトのやりとりのための排他処理に使ってるらしい構造体などが保持されています。実行コンテキストは rb_thread_t などが持っててその上位構造みたいになってるようですね。また Ractor 間でオブジェクトを移動すると元のオブジェクトを Ractor::MovedObject というクラスに書き換えてしまってなんのメソッドにも反応しないようにしているようです。 gc.c をみると ObjectSpace 自体は共通しているみたいですね。

[b52513e2a1] Koichi Sasada 2020-09-03 09:04:36 UTC

79df14c04b452411b9d17e26a398e491bca1a811 で追加した Ractor を利用したテストを GitHub Actions の .github/workflows/compilers.yml で定義しているいろんなコンパイラでためす workflow 内では実行しないようにしています。たまにメモリ関連のエラーで落ちるのでとのこと。

[3f922f3b77] Koichi Sasada 2020-09-03 19:07:34 UTC

b52513e2a1ede39eef094e9e2cfa8710ce26e1f1 で toplevel return を利用してしまっていたので使わないようにしています。古い BASERUBY を考慮してとのこと。

[e0a749c045] git 2020-09-03 19:09:05 UTC

version.h の日付更新

[d4585e7470] Alan Wu 2020-09-03 19:51:14 UTC

21ad4075a71f302474a78dc744149ac8ce2ff0ec および 21ad4075a71f302474a78dc744149ac8ce2ff0ec で rb_raw_obj_info() で T_STRING 型オブジェクトのダンプ用の文字列をバッファに追加する時の文字列サイズを明示するようにした時に RSTRING_LENINT() を使ってましたが、RSTRING_LENINT() はオーバーフロー時に例外を発生させることがあって、この関数は GC 途中に呼ばれる可能性があるのでここで例外を発生させるのはよくないので str_len_no_raise() という専用の関数を追加してこれを使うようにしています。

[169b1d1aca] Nobuyoshi Nakada 2020-09-04 02:46:50 UTC

79df14c04b452411b9d17e26a398e491bca1a811 の Ractor 追加で VC で未初期化の変数の警告が出てたそうなので初期化を追加しています。

[3b0bcaf287] Koichi Sasada 2020-09-03 20:51:55 UTC

rb_ractor_main_p() が TLS(Thread Local Storage) にアクセスするため遅いので Ractor を利用中でなければ呼ばないように Ractor 利用中かどうかを先にチェックするように rb_ractor_main_p() を変更しています。

[fbaab562d9] Marc-Andre Lafortune 2020-09-02 19:34:33 UTC

標準添付ライブラリ ostruct の 1380aa04a6c3681a232046058f4388f3bce904ae で古い ruby でも動くように FrozenError がなかったら RuntimeError を raise するようにしてたのを revert しています。古い ruby の support を切ったからかな。

[d164eef957] Nobuyoshi Nakada 2020-09-04 06:17:42 UTC

rb_objspace_call_finalizer() で解放処理をスキップする条件に main Ractor であることというのを追加しています。

[d7406ccc2c] Nobuyoshi Nakada 2020-09-04 07:28:40 UTC

common.mk の依存関係更新。