ruby-trunk-changes r64379 - r64394

今日は timer thread 廃止後の spurious wakeup 対策とか Enumerator::Lazy の #uniq, #grep_v のメソッドチェイン時の最適化などがありました。

nobu: r64379 2018-08-15 21:53:45 +0900

r64378 の続きで SET_NON_BLOCKING_FAILS_ALWAYS が真の時に未使用な変数の宣言も削除して、到達できないところに UNREACHABLE マクロを置くようにしています。

akr: r64380 2018-08-15 23:24:44 +0900

time.c のうるう秒処理する gmtimew_noleapsecond() で leap_year_yday_offset および common_year_yday_offset というテーブルを参照していたのを mon および mday を lookup する common_year_mon_of_yday, leap_year_mon_of_yday, common_year_mday_of_yday, leap_year_mday_of_yday というテーブルを新規に定義してこれを使うようにリファクタリング(?)しています。

normal: r64381 2018-08-16 03:56:34 +0900

r64204 で ripper のテストで Process.setrlimit でメモリ上限を制限するテストで MJIT が有効な時は上限を引き上げてましたが、まだ足りなかったらしくもうちょっと増やしています。

svn: r64382 2018-08-16 03:56:35 +0900

version.h の日付更新。

nobu: r64383 2018-08-16 09:05:08 +0900

r64239 の rubyspec の socket のテストの FreeBSD 向けの修正を macOS でも適用するようにしています。

nobu: r64384 2018-08-16 09:13:47 +0900

enumerator.c の id_lazy はもう未使用になっていたので削除しています。

nobu: r64385 2018-08-16 09:58:21 +0900

r56185 でやってた Enumerator::Lazy のメソッドチェインした時の Proc オブジェクトを配列に詰めてメソッド呼び出しを迂回して直接 rb_proc_call_with_block() を呼ぶようにした最適化を Enumerator::Lazy#uniq と #grep_v でも対応しています。 r56185 の後で追加されたメソッドだから漏れてたのかな。 https://github.com/ruby/ruby/pull/1930 [ruby-core:88492] [Feature #14994]

svn: r64386 2018-08-16 09:58:22 +0900

r64385 で新規追加したベンチマークスクリプトファイルの svn property 設定。

normal: r64387 2018-08-16 12:37:14 +0900

net/imap のテストで処理中に Interrupt を raise する Thread を立てるテストで協調のためのループ部分で止まってる場合に後始末で Thread#kill で殺すようにしています。Mutex#sleep で待ってる Thread が MJIT が有効な時に意図しない wakeup することがあるためにループ部分で待ち続ける可能性があるそうで、たぶん元々そういう可能性はあったんだと思うけど timer thread 廃止も関係して表面化したんだろうなぁ。大丈夫かなぁ…。

normal: r64388 2018-08-16 17:26:51 +0900

thread_pthread.c の do_gvl_timer() で ubf_wakeup_all_threads() で blocking region の thread に SIGVTALRM を送信した後で処理すべきシグナルがバッファに残っていたらメインスレッドに threadptr_trap_interrupt() を呼んでいます。コミットログを読むとこの中で ubf(unblocking function) を実行させるのが目的みたいです。その前に ruby_sigchld_handler() も呼んでるから、これが確実に処理されるようにするのがメインかも?

normal: r64389 2018-08-16 17:26:56 +0900

rb_thread_wakeup_timer_thread() の引数に 0 を渡すと ubf_timer_arm() でタイマーをセットさせるようにしていましたが -1 も受け付けて -1 の時だけ ubf_timer_arm() を呼び、 0 の時は signal_self_pipe の pipe を通じて timer thread 役の thread に通知するだけに留めるようにしています。SIGVTALRM 利用を減らして spurious wakeup を減らすのが目的のようです。

normal: r64390 2018-08-16 18:16:11 +0900

thread.c の consume_communication_pipe() でシグナルの通知用の pipe から読み込む時には先に ubf_timer_disarm() でタイマーを止めてさらにシグナルが送られるのを防ぐようにしています。「もうわかったから、今やってるから!」って感じですかね。

nobu: r64391 2018-08-16 18:27:53 +0900

Makefile.in の ruby.pc と ruby-runner.h の依存関係に config.status を追加して configure しなおされた時に生成しなおすようにしています。

nobu: r64392 2018-08-16 18:46:20 +0900

macOS の時のライブラリ探索パスを指す環境変数を指定する LIBPATHENV (Linux なら LD_LIBRARY_PATH)に DYLD_LIBRARY_PATH を設定していましたが、DYLD_FALLBACK_LIBRARY_PATH というのを指定するようにしています。チケットによると DYLD_LIBRARY_PATH を直接設定すると pkg-config(1) が探索に失敗してしまうそうです。 [ruby-core:88487] [Bug #14992]

naruse: r64393 2018-08-16 19:50:53 +0900

rubyspec の socket のテストで solaris で失敗しているものを platform_is_not の guard に追加して Solaris 10 での実行を抑制するようにしています。

kazu: r64394 2018-08-16 21:14:11 +0900

appveyor.yml の不要になったコメントを削除しています。