ruby-trunk-changes r63418 - r63436

今日は rb_wait_for_single_fd() の実装に Linux 以外(FreeBSD の新しめのバージョン)でも ppoll() を使うようにする変更や fileutils の更新などがありました。

normal: r63418 2018-05-15 08:40:55 +0900

struct copy_stream_struct のメンバーから fds を削除して select(2) を利用した実装の関数の中のローカル変数として宣言して使うようにしています。Linux で poll() を利用した実装時に不要な fds の初期化をスキップするようにしているみたいです。

svn: r63419 2018-05-15 08:40:57 +0900

version.h の日付更新。

normal: r63420 2018-05-15 08:42:10 +0900

C API rb_wait_for_single_fd() のテスト test/-ext-/wait_for_single_fd/test_wait_for_single_fd.rb で FreeBSD の古いバージョンで不具合があってテストが通らないので skip しているところで、より正確にバージョンを検出するようにしています。

normal: r63421 2018-05-15 08:51:35 +0900

rb_wait_for_single_fd() のテストのための拡張ライブラリで FreeBSD 用? に kqueue(2) の fd を使う実装を追加してそれを使ったテストも追加しています。

normal: r63422 2018-05-15 08:51:39 +0900

rb_wait_for_single_fd() のテストで with_pipe というメソッドを定義して使っていましたが IO.pipe のブロックつき呼び出しで同じことができるのでこっちを使うようにしてメソッド定義を削除しています。

normal: r63423 2018-05-15 09:08:33 +0900

rb_wait_for_single_fd() のテストで端末(tty)や fifo など特殊な fd への対応を確認するためのテスト test/io/wait/test_io_wait_uncommon.rb を追加しています。将来 FreeBSD で ppoll() を使った実装をした時などに問題ないか検出するためにあらかじめテストを入れておこうということみたいです。

svn: r63424 2018-05-15 09:08:34 +0900

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

hsbt: r63425 2018-05-15 10:22:36 +0900

標準添付ライブラリ fileutils に upstream から 1.1.0 をマージしています。fileutils ももう別にリポジトリがあるんだったっけ。 remove_entry_secure に JRuby 用の対応が入ってるみたいです。 https://github.com/ruby/fileutils/pull/18

normal: r63426 2018-05-15 10:29:14 +0900

r63421 で追加した kqueue() を使った fd のテストで rb_raise() のフォーマット文字列に変数を渡してて警告が出てたので "%s" をフォーマット文字列にして変数の内容を埋め込むように修正しています。

normal: r63427 2018-05-15 12:49:21 +0900

FreeBSD 11.0 以降では ppoll() が利用できるそうなので rb_wait_for_single_fd() で ppoll() を使った実装を Linux 以外でも有効にするようにしています。

mame: r63428 2018-05-15 13:16:08 +0900

r63425 の fileutils の更新を revert しています。 fileutils.rb に require "rbconfig" が追加されていたためビルド時にエラーになることがあったみたいです。ビルド時に fileutils を利用してて、まだ rbconfig.rb が生成されてない時点で呼ばれることがあったとかかなぁ。

shyouhei: r63429 2018-05-15 13:35:58 +0900

GCC 8.1 から関数ポインタのキャストが警告になる? ようになったらしく、これを抑制するためオプションに -Wno-cast-function-type を追加するようにしています。対応して警告が減ってきたら(たぶん)消して警告するようにするかも、とのこと。

hsbt: r63430 2018-05-15 14:53:18 +0900

標準添付ライブラリ fileutils の更新のリトライ。 require "rbconfig" の LoadError を捕捉して無視するようにしています。コメントをみると MJIT 用のヘッダ生成のタイミングでエラーになってたみたいです。

nobu: r63431 2018-05-15 16:45:24 +0900

"cause" というシンボルの ID を error.c と eval.c でそれぞれ rb_intern_const() で確保していたので static 変数ではなくグローバル変数にして共有するようにしています。

nobu: r63432 2018-05-15 16:46:55 +0900

tool/generic_erb.rb で標準添付ライブラリ fileutil に依存していたのを FileUtils.touch を File.open と File.utime で実装するようにして依存をなくしています。 encdb.h の生成時に rbconfig.rb がまだ存在しないので r63425 がエラーになってたのを対応しているみたいです。うーん MJIT のヘッダ生成とはまた別にこっちも問題だったのかな。

nobu: r63433 2018-05-15 17:08:24 +0900

configure のオプション --with-jemalloc に maybe というオプション指定を追加して、あれば使うしなかったらあきらめる、という指定ができるようにしているようです。

hsbt: r63434 2018-05-15 19:10:33 +0900

r63430 で fileutils.rb の require "rbconfig" の LoadError を無視するようにしたので、RbConfig を参照しようとしているところで defined? でチェックしてアクセスできなかったら RUBY_PLATFORM 定数をかわりに使うようにしています。元々 r63430 の前は RUBY_PLATFORM だったので、元の実装に fallback するってことのようです。たぶんここが JRuby 対応なのでビルド時には fallback しても問題ないじゃろ、ということですね。

normal: r63435 2018-05-15 19:11:32 +0900

構造体 rb_execution_context_t のメンバー interrupt_mask の型を unsigned long から rb_atomic_t に変更しています。 interrupt_flag と型を揃えているようです。これで環境によってはサイズが減るけど padding のせいで構造体全体のサイズは減らないとのこと。でも他のメンバーの変更とかで差がでるかもしれないから、というか mask すべきメンバーと合わせるのはサイズ節約は別として良いことのような。

nobu: r63436 2018-05-15 19:51:07 +0900

r63435 の変更に追随して signal_exec() で一時的に退避するための変数の型も変更しています。