ruby-trunk-changes 2022-05-28

今日は主に IO の write 系の実装のリファクタリング(出力中の割り込みポイントを減らす)や rubygems の gem update サブコマンドの不具合修正/リファクタリングなどがありました。

[fc184ca1f7] John Hawthorn 2022-02-06 21:48:09 UTC

メモリを特定の型の配列として扱うための API Memory View の lookup_memory_view_entry() 内で引数のクラスの継承関係を辿るのに rb_class_get_superclass() のかわりに Class#superclass の実装である rb_class_superclass() を利用するようにしています。 adc709adb8c7fbe83a20b7c9b554856c98346a4b と同様に不要な T_ICLASS をスキップするためのようです。

[c3fd2e497b] git 2022-05-27 20:38:55 UTC

version.h の日付更新

[ac405dc214] Jemma Issroff 2022-05-26 19:42:42 UTC

misc/lldb_cruby.py の object space の page の内容を出力する関数で未使用の slot の表示に freelist の次の要素のアドレスを追加しています。変数名は klass となってるけたぶんそういうことだと思う。

[8a13a2e8d1] Jemma Issroff 2022-05-26 19:36:41 UTC

struct RBasic::flags のビットフラグで T_CLASS 型の時に使う定数を FL_USER5〜FL_USER8 の範囲を使って定義していたのを FL_USER0〜FL_USER3 の範囲に移動しています。軽く grep した感じで RUBY_FL_SINGLETON が FL_USER0 で被ったりしてるけど大丈夫なのかな?

[ce23cfa518] Samuel Williams 2022-01-08 12:47:51 UTC

io.c の io_binwrite_string() から主要な処理を io_binwrite_string_internal() に切り出して渡されたバッファの途中までしか書き出せてなかったら続きを呼び出すようループする実装にしています。主な呼び元の io_binwrite() でしていたリトライをこの関数内に移動したという感じです。

[15ebfe2849] Samuel Williams 2022-01-08 22:41:20 UTC

ce23cfa5182bb53e8b6555fb6a5b2846cd559922 と同様に io_binwritev() でバッファを全て書き出すまでリトライしていたのをそこから呼ぶ io_binwritev_internal() (元は call_writev_internal() という関数名だったのを改名している)内でループするようリファクタリングしています。コミットメッセージをみると i_binwritev() を atomic にする、とありますがなにか機能的な意味があるのかなこれ?

[216593f59b] Samuel Williams 2022-01-09 06:46:42 UTC

benchmark/io_write.rb という IO#write のマイクロベンチマークスクリプトを追加しています。どうも先の 2つの変更 ce23cfa5182bb53e8b6555fb6a5b2846cd55992215ebfe28493560f8368fc9a2fe7d9b5913051b84 はロック取得の粒度を荒くして性能をかせぐという目的があったみたいですね。

[585e97142d] machty 2022-01-16 14:44:41 UTC

io.c の io_allocate_write_buffer() で書き込み用のバッファを新規確保してなくても rb_io_t::write_lock が未初期化なら mutex を初期化するようにしています。

[c6cd9e180e] Samuel Williams 2022-05-09 10:21:07 UTC

io.c の fptr_finalize_flush() 内の変数 err を error に改名しています。コミットログをみるとなにか他にも変更してそうな雰囲気なんですけど、たぶん改名と少しスタイルの変更だけだと思う。

[ac499bb511] Samuel Williams 2022-05-09 10:21:47 UTC

io.c の finish_writeconv() 内でリトライに goto 文を使っていたのを while 文によるループにまかせるようにリファクタリングしています。

[4efccd28e4] Samuel Williams 2022-05-09 10:36:33 UTC

io.c の io_binwritev_internal() の 15ebfe28493560f8368fc9a2fe7d9b5913051b84リファクタリング時にコピーしてきた errno = EAGAIN の代入の削除。これ要らない気がしたんだけどやっぱり不要だったみたい。

[1589ac6291] Samuel Williams 2022-05-09 11:44:44 UTC

io.c の io_binwrite_string() や io_binwritev_internal() で書き込み用の関数が書き込んだサイズとして 0 を返した時に errno = EAGAIN をセットしておくようにしています。

[753d305503] Samuel Williams 2022-05-10 01:22:09 UTC

io.c で rb_io_t::write_lock が存在する時だけロック取得しているか確認して呼び出し、そうでない時は rb_thread_io_blocking_region() を経由して呼び出すみたいなことをしていたところが 585e97142d4df1e27633afaf98ba589512215c58 で不要になった為? 分岐をなくしています。しかし rb_io_t::write_lock が Qnil になるということはあるみたいでそのチェックをしているように変更しているところもあります。いつ Qnil 入れてるんだろう……と思ったら filnalize 時に 0 をセットしてたのを Qnil を入れるように変更していました。うーんこれ必要なの? また ce23cfa5182bb53e8b6555fb6a5b2846cd55992215ebfe28493560f8368fc9a2fe7d9b5913051b84リファクタリングで long 型の変数を return している関数なのに戻り値を VALUE で宣言していたのはどちらも ssize_t に修正しています。

[6b0131db6f] Samuel Williams 2022-05-28 02:42:02 UTC

Kernel#p の実装で rb_io_flush() を呼び出す時にも rb_uninterruptible() を経由するようにして割り込みされないようにしています。

[e78c1ddb1e] David Rodríguez 2022-05-25 11:33:20 UTC

rubygems の gem update サブコマンドの --install-dir 指定があった時にそれを利用していなかったところがあったのを修正しています。

[e9c4e37f1f] David Rodríguez 2022-05-26 10:44:33 UTC

rubygems の gem update サブコマンドの実装の Gem::Commands::UpdateCommand#highest_remote_name_tuple で引数の spec から platform などが一致しているものを絞る処理は呼び元で行なわれているため冗長とのことで削除しています。