ruby-trunk-changes r62664 - r62677

今日は MJIT でのコード生成で一部の VM 命令の inline 化する最適化や例外の backtrace メソッド内で block する処理を書いた時の不具合修正、Mutex を保持した状態での Kernel#fork の不具合修正などがありました。

kazu: r62664 2018-03-05 21:23:48 +0900

r62644 の win32/Makefile.sub で mjit_config.h の生成時の参照変数名の typo 修正。

normal: r62668 2018-03-06 07:58:13 +0900

thread_sync.c に rb_mutex_cleanup_keeping_mutexes() という関数を追加。 Thread が保持している Mutex を管理するリストを空に初期化する処理を fork 時に子プロセスで呼んで親の Mutex 保持の情報を引き継がないようにしています。 r58604 の構造体サイズの shrink 時に入りこんだ不具合修正だそうです。 [ruby-core:85940] [Bug #14578]

svn: r62669 2018-03-06 07:58:14 +0900

version.h の日付更新。

hsbt: r62670 2018-03-06 09:52:15 +0900

test/lib/test/unit.rb に重複した宣言的な private メソッド呼び出しがあったので削っています。

nobu: r62671 2018-03-06 11:48:17 +0900

標準添付ライブラリ resolv で Resolv::Hosts.new でソケットを開いていたのを lazy_initialize というメソッドに分離して初期化を遅延させるようにしています。 fd leak していたのを修正しているようです。またソケットなどのリソースの管理を Mutex で保護するようにして multi thread での利用時の race condition が発生する可能性があったのを修正しています。 [ruby-core:85901] [Bug #14571]

nobu: r62672 2018-03-06 12:31:46 +0900

標準添付ライブラリ resolv の Resolv::DNS.rangerand という特異メソッドを削除しています。 random メソッドが引数に Range を受け付けるのでもう不要になっていたようです。

nobu: r62673 2018-03-06 14:15:57 +0900

thread.c の unblock_function_set() という関数で rb_thread_t::unblock を設定する前に割り込みチェックするところのループ条件に raised_flag をみるようにしています。 チケットや追加されたテストをみるに、backtrace メソッドに block しうる処理が書いてあるような例外クラスを定義した時にその例外発生時に hang する可能性があったみたいです。 r16651 からというからずっと昔からあったものみたいですね。 [ruby-core:85939] [Bug #14577]

nobu: r62674 2018-03-06 14:59:29 +0900

標準添付ライブラリ resolv の Resolv::IPv6.create のテストでエラー時のメッセージを追加。

nobu: r62675 2018-03-06 18:03:24 +0900

r62663 で parse.y で非可視な文字の token を宣言するようにしましたが、空白文字については既に利用されているため? エスケープされた空白文字として tSAPACE と名前をつけて宣言するようにしています。古い bison でエラーになることがあったみたいです。

k0kubun: r62676 2018-03-06 20:46:02 +0900

MJIT 用ヘッダを arch 毎に minimize する tool/transform_mjit_header.rb で型の conflict を検出した時のデバッグ用出力を削除しています。

k0kubun: r62677 2018-03-06 21:53:19 +0900

tool/transform_mjit_header.rb で vm_opt_xxx の最適化命令を実装する関数群を、MJIT でコンパイルするためのコード生成時に inline 関数化する最適化。なるほど gcc/clang でビルドするから生成するコードでがんばって inline 化しなくても inline 関数として宣言すればコンパイラがやってくれる。これで JIT 有効化状態で optcarrot がより高速になるそうです。