ruby-trunk-changes r63741 - r63748

今日は子プロセス fork の race condition 修正などがありました。

normal: r63741 2018-06-24 21:36:44 +0900

rb_fork_ruby() で fork(2) 前の処理で before_fork_ruby() の前に disable_child_handler_before_fork() を呼んで signal mask をかけておくようにしています。 signal を main thread に配送する役割をしている timer thread を止める前に mask をかける必要があったようです。 [ruby-core:87622] [Bug #14868] [Bug #13916]

normal: r63742 2018-06-25 07:08:15 +0900

拡張ライブラリ socket の UNIXSocket#recv_io で fd が枯渇していて recvmsg(2) から EMFILE または ENFILE がかえってきた時に余計な IO が close されるのを期待して rb_gc_for_fd() を呼んで GC を起動してリトライするようにしています。また struct msghdr::msg_control_len が足りない時も GC を呼ぶようにしています。

svn: r63743 2018-06-25 07:08:16 +0900

version.h の日付更新。

normal: r63744 2018-06-25 10:06:15 +0900

mjit.c でコンパイラ起動する子プロセスを execvp(3) で起動していたのを execv(3) を呼ぶようにしています。async-signal-safe なライブラリ関数を使うようにするため。そのため事前に PATH から呼ぶべきコマンドのパス解決をしておくようにしています。

normal: r63745 2018-06-25 11:52:29 +0900

mjit.c のコンパイラオプションの選択のための preprocessor の分岐で FreeBSDDebian 上での clang のための __FreeBSD__ や __GLIBC__ をチェックも条件に追加しています。

normal: r63746 2018-06-25 11:52:34 +0900

mjit.c で関数ポインタをキャストするのに ptrdiff_t を使っていたのを符号なしの uintptr_t を使うように修正しています。 32bit 環境でうまく動かなかったとのこと。

shyouhei: r63747 2018-06-25 12:14:48 +0900

r63742 の変更で ext/socket/unixsocket.c の enum の宣言の最後にカンマがあったのが C99 以降でのみ許された記法なので削っています。

normal: r63748 2018-06-25 16:57:39 +0900

r63744 の mjit.c で execvp(3) のかわりに execv(3) を使うようにする変更で、パスの解決に失敗した(みつからなかった)時のメッセージを fprintf(3) で stderr に出力していたのを mjit.c 内の utility 関数 verbose() を利用するようにしています。