ruby-trunk-changes r66476 - r66495

今日は Mutex と fork の組み合わせでの不具合修正や Enumerator::ArithmeticSequence を Array#[] に渡した時などにエラーにする変更などがありました。

normal: r66476 2018-12-21 21:32:48 +0900

thread_sync.c の rb_mutex_abandon_keeping_mutexes() で th->keeping_mutexes の NULL チェックは不要なので削除とのこと。rb_mutex_abandon_all() が NULL を渡しても大丈夫なので。

normal: r66477 2018-12-21 21:32:52 +0900

fork した時の Mutex のオリジナルのプロセスを保持するための rb_mutex_t::fork_gen に rb_mutex_cleanup_keeping_mutexes() で Thread が保持してる Mutex の待ちキューを解放する時にも VM の fork_gen をセットしておくようにしています。 ここでリセットしないと親のプロセスの Thread が確保した Mutex として扱われて利用しているのに解放される恐れがあるからみたいです。と、書いてあるけど、なんかちょっと違う気がする。どうもこの後にも再修正があるみたいです。そもそも rb_mutex_cleanup_keeping_mutexes() という関数が消えてる。 [ruby-core:90312] [Bug #15383] [ruby-core:90595] [Bug #15430]

mrkn: r66478 2018-12-21 22:05:16 +0900

Enumerator::ArithmeticSequence クラスを保持する C の変数 rb_cArithSeq の static をはずして range.c から参照できるようにして、Enumerator#sum が呼ばれた時や Array#[] の引数に渡した時に誤って Range オブジェクトの一種として扱われると step がない Range として扱われてしまうので、エラーにするようにしています。

k0kubun: r66479 2018-12-21 23:01:49 +0900

MJIT のテストでエラー時のメッセージ追加と未使用の変数削除。

k0kubun: r66480 2018-12-21 23:33:25 +0900

Wercker での --jit-wait オプションつきのテストで rubygems の Gem::RemoteFetcher のテストを除外。

svn: r66481 2018-12-21 23:33:26 +0900

r66480 の新規追加ファイルの svn property 設定。

k0kubun: r66482 2018-12-22 00:07:18 +0900

.travis.yml で macOS では make の -j オプションを渡すのをやめています。理由がわからないテスト失敗の調査のためとのこと。

svn: r66483 2018-12-22 00:07:19 +0900

version.h の日付更新。

k0kubun: r66484 2018-12-22 01:07:41 +0900

r66482 の続きで .travis.yml で macOS の時に JOBS 変数を空にしておくようにしています。テスト時だけじゃなく他のビルドも並列化しないようにしています。

k0kubun: r66485 2018-12-22 01:19:31 +0900

テスト用拡張ライブラリ ext/-test-/arith_seq/extract/extract.c の未使用の変数削除。

k0kubun: r66486 2018-12-22 01:36:37 +0900

Travis-CI の macOS でのテスト時に調査のため -v オプションをつけるようにしています。

normal: r66487 2018-12-22 06:44:09 +0900

fork と Mutex の組み合わせのテストの失敗の調査のため、子プロセスの標準エラー出力を一時ファイルにリダイレクトしてなにか出力がないかチェックするようにしています。 [ruby-core:90595] [Bug #15430]

normal: r66488 2018-12-22 08:32:36 +0900

r66487 で調査用コード追加したテストで起動する Thread 数を減らしています。 プロセス数制限にひっかかって Thread 起動で SIGKILL で殺されてるんじゃないかという推測みたいですね。しかしプロセス上限の時って SIGKILL で殺されるんだっけ? 単に thread 生成が失敗しそう。

normal: r66489 2018-12-22 10:41:18 +0900

r66477 のコメントでも書いてましたが、rb_mutex_t::fork_gen に Mutex の保有者のプロセスを持っておくのは実は不要で、rb_mutex_abandon_locking_mutex() で th が保持している Mutex のリスト全てをクリアしてたのがまずくて、待ちキューから外すだけに修正して、rb_mutex_t::fork_gen メンバーは不要になったとして削除しています。これで fork 時の rb_mutex_cleanup_keeping_mutexes() も削除しています。fork_gen はわかりやすい仕組みだったけど、本当に大丈夫かなぁ。 [Bug #14578] [Bug #15383]

k0kubun: r66490 2018-12-22 10:43:45 +0900

benchmark/app_erb.yml から埋め込まれてる ruby スクリプト内の未使用の変数を削除しています。

nobu: r66491 2018-12-22 16:14:12 +0900

Exception#cause の表示のテストで期待するメッセージの書きかたをちょっと変更しています。ruby-mode.el がハイライトを誤解するのでその対処みたいです。

nobu: r66492 2018-12-22 16:14:13 +0900

r66475 で追加した Exception#cause に例外以外のものがセットされてた時の出力のテストでデバッグ用の puts が残ってたのを削除。

nobu: r66493 2018-12-22 16:14:14 +0900

Exception#cause で 2つの例外が互いを cause として参照しあうような構造を作って raise した時に表示で無限再帰に陥らないように、show_cause() で内部オブジェクトの ID テーブルを作って既に表示した例外に再度辿りついたら打ち切るようにしています。 [ruby-core:90656] [Bug #15447]

normal: r66494 2018-12-22 17:08:03 +0900

r66488 の続き。 Process.getrlimit(:NPROC) が小さい時だけ起動する Thread 数を半分にしていましたが、常に 25個に抑えるようにしています。 RLIMIT_NPROC がないシステムもあるから。

nobu: r66495 2018-12-22 19:23:06 +0900

キーワード引数の exception のために rb_intern() を呼んでいるところが複数あったので組込みの ID idException を利用するようにしています。