ruby-trunk-changes 2021-06-14

今日は blocking fiber のための Scheduler の対応で SEGV する可能性があった不具合の修正などがありました。

[70313ec01a] Yusuke Endoh 2021-06-14 01:02:02 UTC

先頭に "::" をつけてトップレベルに定義することを明示した定数の演算子つき代入式で生成される AST の定数名部分の NODE のコード位置情報の範囲がずれているのを修正しています。

[09ea2bb040] git 2021-06-14 01:09:30 UTC

version.h の日付更新

[688b217706] Yusuke Endoh 2021-06-14 01:40:41 UTC

time.c の Windows 環境向けの tzname および daylight のマクロ定義の preprocessor 分岐の書きかたが Solarisコンパイラでエラーになるとのことで defined() のチェックを追加しています。 [ruby-core:104238] [Bug #17947]

[2792acc8f2] Samuel Williams 2021-06-14 04:21:08 UTC

拡張ライブラリ socket の Addrinfo.getaddrinfo を blocking fiber のための Scheduler 対応をして Schedule#address_resolve メソッドが呼ばれるように対応を追加しています。テスト用のサンプル実装をみると結局 Thread を使ってますが、resolv はしかたないですね。 https://github.com/ruby/ruby/pull/4375

[f0f9e77b65] Nobuyoshi Nakada 2021-06-14 04:49:10 UTC

load.c の require_internal() で GCC 11 での "might be clobbered by 'longjmp' or 'vfork'" 警告を抑制するため volatile 変数を導入しています。

[635e1c5282] Nobuyoshi Nakada 2021-06-14 04:52:26 UTC

load.c の require_internal() で volatile 変数を 3つ定義していたのを、構造体にまとめて全体を volatile 修飾子つきで宣言するようにしています。うーん、これはなんでだろう。

[626427c2e0] Nobuyoshi Nakada 2021-06-14 05:11:38 UTC

2792acc8f29c6ee1d04b57b7b70d43519a0ceda8 の変更で未使用になった ext/socket/socket.c の sock_s_getnameinfo() 内の変数の宣言を削除しています。

[050a895439] Samuel Williams 2021-06-14 05:56:53 UTC

blocking fiber のための Scheduler を Thread に設定する時に必須なメソッド(block, unblock, kernel_sleep, io_wait) が定義されているか rb_respond_to() 関数でチェックするようにしています。 また rb_threadptr_join_list_wakeup() や rb_threadptr_unlock_all_locking_mutexes() で rb_thread_t::join_list や rb_thread_t::keeping_mutexes を辿る時に途中で例外が発生すると不正な要素をリストに残してしまうためか SEGV が発生するという不具合があったようなので先にリストから外してから処理するようにしています。また rb_threadptr_join_list_wakeup() と rb_threadptr_unlock_all_locking_mutexes() の呼び出しを EC_EXEC_TAG() と EC_POP_TAG() の間に移動して、例外発生時の捕捉されるようにしています。 https://github.com/ruby/ruby/pull/4471

[25921fe1d6] Samuel Williams 2021-06-14 08:49:43 UTC

f0f9e77b65990001bd2acb42e1c6b673f6324425 の load.c の警告抑制のための変更を revert しています。特に問題なさそうだけどなんでだろ。

[1ab71a5b98] Bruno Sutic 2021-06-14 09:07:59 UTC

2792acc8f29c6ee1d04b57b7b70d43519a0ceda8 で追加された Addrinfo.getnameinfo の blocking fiber 対応のテストで Socket::NI_NUMERICSERV を渡してサービス名でなくポート番号で取得してチェックするようにしています。 Solaris でサービス名が違うか解決できなかったかなにかでテスト失敗していたのに対応するためとのこと。