ruby-trunk-changes 2019-07-19

今日は fiber pool の実装の追加修正やチューニング、デバッグ用コード追加などがありました。

[a027c4b5b0] Nobuyoshi Nakada 2019-07-18 21:15:05 UTC

parse.y のブロック引数のルールで終端というかなにもない時の値を 0 (ripper の場合は Qundef) と書いてたのを Qnull にしています。 Qnull ってあったっけ、と思ったら parse.y で 0 or Qundef (ripper の場合)に定義されてました。なので実際には変化はないはず。

[a036a8a038] Nobuyoshi Nakada 2019-07-18 21:15:47 UTC

おそらく fiber pool がらみで追加になった関数群の定義のスタイルの修正。

[d4c4029597] git 2019-07-18 21:40:24 UTC

version.h の日付更新

[18bce998dd] Nobuyoshi Nakada 2019-07-18 22:48:30 UTC

拡張ライブラリ ripper 向けの parse.y の警告除去のための明示的キャスト追加や RIPPER_DEBUG が真の時の ripper_validate_object() での VALUE の値がオブジェクト用のヒープ内を指してるかのチェックの削除。 回収済みのタイミングとかで指さなくなってるケースがあるってことかなぁ。

[59d6ce4f4b] Nobuyoshi Nakada 2019-07-18 22:48:55 UTC

同じく RIPPER_DEBUG が定義されている時だけ追加していたデバッグ用メソッドを Kernel モジュールに定義していたのを Ripper のインスタンスメソッドとして定義するように変更しています。

[0b826418af] Nobuyoshi Nakada 2019-07-18 22:51:48 UTC

make commit でコミットを push する前に make up で手元を最新に追随させておくようにしています。

[fd461dea06] Nobuyoshi Nakada 2019-07-18 22:55:40 UTC

59d6ce4f4bf2d77dfd07975fed6a49609c2df97e でメソッドの位置を移動したデバッグ用メソッドのひとつ Ripper#validate_object で、返すオブジェクトが ruby レベルで見えないように klass をクリアされたものだったら例外を発生させるようにしています。

[9dda0a03cc] Samuel Williams 2019-07-18 23:00:58 UTC

rb_vm_push_frame() を削除しています。えっ? と思ったけど vm.c で直接 vm_push_frame() を呼べばいいところしか残ってないので既に不要になっていたようです。

[d7fdf45a4a] Samuel Williams 2019-07-18 23:09:52 UTC

なんとなく既視感がありますが(9790b778a339f36f9b29517a1d762cf02a2f0293) cont_init() で cont->saved_ec.cfp を明示的に NULL クリアしておくようにしています。 cont_mark() で未使用の execution context の mark をスキップする時に判定に使うため。

[c8ee44f44c] aycabta 2019-07-18 23:23:37 UTC

irb でタブ補完時に rdoc を引く時にインスタンスメソッドの名前を引くために receiver の class 名の名前を取得しないといけないところインスタンス自体の name メソッドを呼んでたのを修正しています。この修正も既視感あるな、と思ったら同様のメソッド名組み立ててるところがほかにもあったので修正漏れのようでした。

[8ca32020b0] Samuel Williams 2019-07-18 23:32:40 UTC

d7fdf45a4ae1bcb6fac30a24b025d4f20149ba0a の cont_init() で saved_ec.cfp を NULL クリアするのは revert しています。あれ、なんでだろ。

[4ec5b39ce8] Koichi Sasada 2019-07-18 23:53:19 UTC

d7fdf45a4ae1bcb6fac30a24b025d4f20149ba0a のかわりなのかなと思いますが fiber_t_alloc() で rb_fiber_t を確保した時に fib->cont.saved_ec.cfp を NULL クリアしておくようにしています。

[e644e2de85] Kazuhiro NISHIYAMA 2019-07-19 00:00:55 UTC

doc/etc.rd.ja は古くなってるので削除しています。 [Feature #16003] [ruby-dev:50814]

[63160a84b4] Koichi Sasada 2019-07-19 03:04:32 UTC

ruby_assert.h で NDEBUG マクロが定義されていたら RUBY_NDEBUG も 1 に定義して assert のチェックやデバッグ用のコードが有効になるようにしています。include/ruby/assert.h でも同様の定義がされていますが ruby/ruby.h 経由で ruby/assert.h を include した後で NEBUG を #define してから ruby_assert.h を include している場合(array.c) があって、その場合も RUBY_NDEBUG が有効になるようにしたかったみたいです。ややこしいですね…。

[6eef80d824] Samuel Williams 2019-07-19 02:54:31 UTC

空っぽで実際にはなにもチェックしていなかった rb_ec_verify() の定義を消しています。また VM スタックの有無と ec->cfp に値がセットされてるかどうかが連動していることをチェックする VM_ASSERT() をいくつか追加しています。

[cf93f98a60] Samuel Williams 2019-07-19 03:45:44 UTC

9790b778a339f36f9b29517a1d762cf02a2f0293 や 4ec5b39ce8bd3b13dec0ac290b2d7d29c640b304 ec->cfp を NULL クリアしていたのを revert して rb_ec_clear_vm_stack() 内で ec->cfp を NULL クリアするようにして、必要ならこの呼び出しを追加しています。

[dd0e33f083] Samuel Williams 2019-07-19 03:53:47 UTC

coroutine/copy/Context.h で複数の条件を && で連結して assert() を呼んでたのを 1つ1つ分けて呼ぶようにリファクタリングしています。どれが失敗したのかわかるようにするため。

[e14f5762c5] Samuel Williams 2019-07-19 03:55:34 UTC

dd0e33f0839124a910f4eb0bb67423e041036645 で分割した coroutine/copy/Context.h の assert(3) のうち stack と size についてのチェックはここから呼んでる coroutine_initialize_main() という関数の中に移動しています。

[547f574b63] Samuel Williams 2019-07-19 04:03:47 UTC

6eef80d824aa4aca91ff13ea215f5cd053d16906 で追加した vm_stack と ec->cfp が連動してるか確認する VM_ASSERT() を削除しています。確認できたから消す、のかと思ったら vm_stack は NULL だけど ec->cfp が NULL じゃなくなるケースというのがあったためということで、うーん、いいのかそれは…

[182ae1407b] Koichi Sasada 2019-07-19 04:02:38 UTC

Array オブジェクトで dup した時にバッファを共有したオブジェクトを作ったときに共有元の Array オブジェクトのことを "shared_root" って呼ぶように徹底しようね、ということでいくつかの構造体メンバーやマクロ名を shared -> shared_root のように改名しています。また debug counters に Array の共有 Array の数などをカウントするように追加しています。

[a44ad9a145] git 2019-07-19 04:10:08 UTC

182ae1407b3f6597cdbf6872f788c1ed3aa22a35 のインデントのタブを空白に展開。

[ae750799c1] Koichi Sasada 2019-07-19 05:37:59 UTC

array.c で ARY_SHARED_P()、ARY_EMBED_P()、ARY_OWNS_HEAP_P()、ARY_SHARED_ROOT_P() などのチェック系マクロで FL_TEST() を使ってオブジェクトのタイプのチェックをしていたところを FL_TEST_RAW() を使うようにして FL_ABLE() のチェックを省き、かわりに assert() でデバッグ用ビルド時のみ RB_TYPE_P() によるチェックをするようにしています。不要なチェックを削って高速化するためみたいです。

[fba3e76e3f] Koichi Sasada 2019-07-19 07:24:14 UTC

debug counters の Hash の要素数ごとのカウンタの名前を変更して範囲がひとめでわかるようにしています。

[e004afd46d] Samuel Williams 2019-07-19 07:42:00 UTC

cont.c の fiber pool 関連の関数に VM_ASSERT() によるチェックやデバッグ出力を追加しています。また madvise() でメモリ領域解放時にすぐシステムに返すように指定する時に MADV_DONTNEED を使う場合は VM_CHECK_MODE が 1以上の時だけ行うようにしています。

[517f7f9b57] Samuel Williams 2019-07-19 08:09:03 UTC

cont.c の 32bit 環境での文法エラーを修正。

[0a7093a8e9] Samuel Williams 2019-07-19 08:18:42 UTC

fiber_pool_allocate_memory() にスタック領域用メモリ確保の戦略についてコメントを追加しています。