ruby-trunk-changes r64358 - r64378

今日は Hash をキーワード引数に展開して渡す時のキーが Symbol 以外受け付けないようにする仕様変更や、timer thread 廃止の変更の追加修正やテスト追随などがありました。

nobu: r64358 2018-08-14 20:58:17 +0900

Hash をキーワード引数に展開して渡す時に文字列のキー(というか Symbol 以外のキー)は ArgumentError を発生させるように仕様変更しています。 https://twitter.com/yukihiro_matz/status/1022287578995646464

normal: r64359 2018-08-15 02:07:36 +0900

rubyspec の IO のテストのための拡張ライブラリで errno に依存しているところで errno を設定できるインタフェースを追加して回避するようにしています。うーん、これはテストが悪いのかな……。なんか C API の互換性が壊れているというわけではないのかな。

svn: r64360 2018-08-15 02:07:37 +0900

version.h の日付更新。

normal: r64361 2018-08-15 07:06:40 +0900

r64357 の Solaris で timer thread を使うようにしたのは r64359 の rubyspec の修正(?)で不要になったそうなので revert しています。

normal: r64362 2018-08-15 07:59:57 +0900

r64238 でテスト時の一時ファイルの leak のチェックで Tempfile のファイルが実際に削除されてるかどうかをチェックに入れてたのは revert しています。これも次の(r64362 の)修正で不要になるので、とのこと。

normal: r64363 2018-08-15 08:00:02 +0900

r64362 で revert したテスト時の Tempfile の消し忘れ検出で File.exist? もチェックするようにしたのは、webrick のテストで Tempfile で作ったファイルを rename してたせいらしくて、正常時のみ rename して例外発生時は後始末するように修正しています。 [ruby-core:88477]

k0kubun: r64364 2018-08-15 08:23:44 +0900

appveyor.yml の MinGW 版のビルド時の test-all に V=1 と TEST_EXCLUDES の指定を追加しています。よくわかりませんが最初から TEST_EXCLUDES がなにか設定されている? かなにかで全テスト が skip されているみたいなのでそれを調査するためみたいです。

k0kubun: r64365 2018-08-15 10:40:57 +0900

readline のテストと非常に大きな文字列を環境変数にセットするテストで AppVeyor 上で MinGW 版の時には skip するようにしています。

k0kubun: r64366 2018-08-15 10:55:09 +0900

r64365 の ENV のテストのほうは r64293 で Windows での環境変数のサイズ制限が最近のバージョンではなくなってるのに対応した時に MinGW も制限があるほうに分岐してたせいみたいなのでそこを修正して skip はしないように戻しています。

nobu: r64367 2018-08-15 11:05:20 +0900

io_spec_rb_io_wait_readable() の宣言に NORETURN() を使って処理が戻ってこないことを明示するようにしています。

nobu: r64368 2018-08-15 11:15:13 +0900

appveyor.yml のコマンドの一部を sh -c 経由で実行しないようにしています。詳しくは書いてありませんが msys の sh にはなにか問題があるらしい。

k0kubun: r64369 2018-08-15 12:03:18 +0900

r64365 の AppVeyor 上での MinGW で通らないテストのために readline のテストの setup で環境変数 APPVEYOR をみてスキップさせてたやつで teardown のほうも無視させないといけなかったので同じチェックして return させるようにしています。

nobu: r64370 2018-08-15 13:10:19 +0900

r64364 の AppVeyor 上での MinGW での make test-all に TEST_EXCLUDES 変数を明示するようにしたのを revert して、set MSYS_NO_PATHCONV=1 という変数設定をしておくようにしています。よくわかりませんが msys がパスを勝手に変換してしまうのを抑制するものみたいですね。

normal: r64371 2018-08-15 13:32:36 +0900

timer thread の廃止で blocking region に入ってる thread を起こすためにやっぱり timer thread を使うっていう環境で ubf_timer_pthread_create() を呼ぶ前に UBF_TIMER の値をチェックする分岐を明示的に入れています。定数マクロなので最適化で消えるはずですがコードの読みやすさのためとのこと。 [ruby-core:88475] [Misc #14937]

normal: r64372 2018-08-15 13:32:41 +0900

thread_pthread.c の変数 timer_thread_pipe を signal_self_pipe に改名しています。この pipe って timer thread 役の thread に通知するための pipe だと思ってたんだけど違うのかな。 [ruby-core:88475] [Misc #14937]

normal: r64373 2018-08-15 13:32:46 +0900

rb_timer_disarm() などの rb_timer_xxx() の関数群を ubf_timer_disarm() のように ubf_timer_xxx() に改名しています。 export しないので rb_ という prefix を使わないようにしています。 [ruby-core:88475] [Misc #14937]

k0kubun: r64374 2018-08-15 13:51:10 +0900

r64355 で謎の IO.select を追加して timer を抑制して対処していた、timer thread 削除を入れたら通らなくなった fiddle のテストですが、これは MJIT とシグナル処理の変更の関連があるみたいで、r64355 で --jit-wait オプションを指定した実行では逆にハングアップしてしまうみたいなので、とりあえず MJIT が有効だったら skip するようにしています。

normal: r64375 2018-08-15 14:31:31 +0900

構造体 native_thread_data_t の ubf_list を共用体にして ubf と gvl という別の名前を持たせるようにしています。両方ともこれまでと同じ struct list_node なので実体は変更ありませんが、読みやすさのためにどっちの用途で使われてるのかを明示しようとしているのかと。 [ruby-core:88475] [Misc #14937]

normal: r64376 2018-08-15 14:54:41 +0900

構造体 rb_thread_t のフラグ類を bitfield にして既存の bitfield とまとめて構造体サイズを節約しています。久しぶりの構造体ダイエット。

normal: r64377 2018-08-15 16:16:55 +0900

thread_pthread.c の gvl_acquire_common() から gvl.timer が無効な時に timer thread 代わりの thread が完全に wait せずにタイムアウトつきで定期的に起きるようにする処理を do_gvl_timer() という関数名で切り出すリファクタリング。 また UBF_TIMER マクロの定義部分のコメントで blocking region の thread を定期的に起こす理由を詳細に追加しています。 [ruby-core:88475] [Misc #14937]

nobu: r64378 2018-08-15 20:01:30 +0900

rubyspec の IO の C API テスト用の拡張ライブラリで SET_NON_BLOCKING_FAILS_ALWAYS というマクロが真だと set_non_blocking() という関数が常に return -1 するようになっているため、絶対に通らないパスがあって、そこを preprocessor の分岐で消すようにしています。最適化によってコンパイラが unreachable と判定して警告が出てたのかな。