ruby-trunk-changes 2022-07-08

今日は主に GC.compact 関連の不具合修正や Thread#value を Kernel#fork した後のプロセスで呼んだ時の不具合修正などがありました。

[7f64989e5c] 卜部昌平 2022-07-06 00:18:28 UTC

include/ruby/internal/memory.h で MinGW 環境で memcpy(3) のシンボルをマクロで再定義していたのをやめています。かわりに internal.h に移動しています。 [ruby-core:109118] [Bug #18893]

[d7c5a6d49b] Peter Zhu 2022-07-06 21:00:13 UTC

gc.c の gc_compact_move() 内で gc_sweep_page() に渡すヒープの変数を移動先にすべきところを移動元のほうを渡していたのを修正しています。結構大胆な間違いだけど異常終了の可能性はあったのだろうか。そういうことはなさそう。パフォーマンスへの影響はあったかもしれませんが。

[d6c98626da] Peter Zhu 2022-07-06 21:04:22 UTC

gc.c の gc_compact_move() で gc_sweep_page() を呼び出すところで移動元の heap を mprotect(2) などによるメモリバリアによる保護をかけておくようにしています。 移動先の heap に対する sweep 処理で移動元で既に T_MOVED になっている slot への参照を辿ることがあるかもしれないのでそれを検出できるようにするためみたいです。

[f36859869f] Peter Zhu 2022-07-06 21:30:36 UTC

gc.c の GC.compact での移動したオブジェクトへの参照を検出するための read_barrier_handler() で GET_PAGE_BODY() で対象の slot の struct heap_page_body を得られなかった時に rb_bug() で明示的に異常終了させるようにしています。本来 0 にならないはずだけどそうなってしまって SEGV するという現象があったみたいですね。

[61c7ae4d27] Nobuyoshi Nakada 2022-06-15 02:25:30 UTC

gc.c の heap のページサイズに関する preprocessor の分岐をリファクタリングしています。

[587d2d199b] Jean Boussier 2022-07-07 13:20:35 UTC

GVL の確保/解放処理のコールバック関数を登録する C API で登録されたコールバック関数に POSIX thread の時の natgive_sleep() の実装で suspended イベントを発行するようにしています。内部実施で thread の一時停止のために native_sleep() を呼ぶことがあってここで状態遷移のイベントが不足していたとのこと。 [ruby-core:109157] [Bug #18900]

[0018c2646d] git 2022-07-07 15:49:15 UTC

version.h の日付更新

[4d8f12ba38] Matt Valentine-House 2022-07-07 14:48:22 UTC

7f64989e5c913ef7624e084badd1a43ce65b3ccc で internal.h で memcpy() をマクロで再定義するところで再定義の警告抑制のために #undef しておくようにしています。

[c8b3bd45cc] Peter Zhu 2022-07-07 13:32:43 UTC

拡張ライブラリ openssl の extconf.rb で $warnflags が nil の場合に対応して safe-guard 演算子を利用するようにしています。

[7dd0a22588] David Rodríguez 2022-07-07 07:57:27 UTC

bundler のテストで環境変数 BUNDLER_SPEC_WINDOWS を指定して Windows 環境であるかのようにみせかけてテスト実行できるようにしているようです。

[65ae2bb2e0] Jean Boussier 2022-07-07 14:28:43 UTC

Thread#value の実装で thread_join() しても rb_thread_t::value が Qundef になっている場合 nil を返すようにしています。fork した時に呼び出した以外の Thread はそのまま停止されるのでそういう時に Qundef のままになってしまうからということみたいです。Qundef は ruby レベルからみえてはいけない値なのでかわりに Qnil を返すことで ruby レベルでは nil が返却されるようにしています。 [ruby-core:109162] [Bug #18902]

[55c5bf27f5] Burdette Lamar 2022-07-07 18:15:32 UTC

標準添付ライブラリ irb の lib/irb/lc/help-message というファイルの整形など。

[621e5c568a] Burdette Lamar 2022-07-07 18:47:55 UTC

拡張ライブラリ date の rdoc 用コメントのクロスリファレンスの修正など。

[3cf2c2e4a1] Aaron Patterson 2022-06-30 17:38:48 UTC

struct RBasic::flags のビットフラグの定数 ISEQ_MARKABLE_ISEQ は(おそらく e23540e5666664e23f2adecdc2cc591f3ff6fe2f などの bitmap 導入に伴なって)不要になったということで削除して、フラグを立てていたところも削除しています。

[cf991337fb] Nobuyoshi Nakada 2022-07-08 01:41:19 UTC

GVL のイベントコールバック関数 C API テスト用の拡張ライブラリ内の関数に static 修飾子を追加しています。

[f1c15f3e94] Nobuyoshi Nakada 2022-07-08 01:41:53 UTC

GVL イベントコールバック関数登録用 C API のテストで呼び出されたカウンタのチェックする assertion の条件を緩めています。タイミングに依存したテストになってたみたいです。

[4a2662ae8b] Nobuyoshi Nakada 2022-07-08 02:20:02 UTC

eaeb130b11fefe91aaf61f294ea32af76dada74f の文字列リテラルのあとに ":" を置く記法の後の改行があった時の不具合修正で追加したテストで未使用変数の警告が出てたのを避けるようにテストコードを変更しています。また少しチェック内容も増やしています。 [ruby-core:109113] [Bug #18890]

[9958ed61bc] Nobuyoshi Nakada 2022-07-08 03:11:56 UTC

iseq.h の ISEQ_MBITS_BUFLEN() というマクロの定義で roomof() マクロを利用するようにしています。

[7bab788309] Nobuyoshi Nakada 2022-07-08 06:59:25 UTC

iseq.c の bitmap 操作関数 iseq_scan_bits() で最下位ビットをクリアする処理が難しかったので 1 引いて AND を取るという処理に書き直しています。 0 だった時にオーバーフローして……と思いましたがその時は元が 0 なので AND 取ったら 0 になるので問題ないですね。