ruby-trunk-changes r52723 - r52735

今日は拡張ライブラリ fiddle で外部ライブラリの関数を呼び出している間 GVL を解放するようにする変更や、BeOS のサポート打ち切り、ripper での無効な magic comment についての警告機能の追加などがありました。

normal: r52723 2015-11-24 06:20:56 +0900

拡張ライブラリ fiddle で Fiddle::Function#call で外部ライブラリの関数を呼び出す時に GVL を解放してから呼び出すようにしています。長時間ブロックする関数を呼ぶ時に別の Thread が実行できるようにしています。また callback 関数の呼び出し時に GVL を再取得する時に判定するため internal.h に ruby_thread_has_gvl_p() を移動して、fiddle のビルド時に internal.h を #include するようにしています。 Fiddle::Function の呼び出しのオーバヘッドは増えるので頻繁な呼び出しでは遅くなってしまいますね。 しかし ubf がないので Thread#kill 時などに割り込みがきかないので終わるまで待つことになりますね。もちろん全体がブロックするよりは良いのですが。 [ruby-core:71642] [Feature #11607]

svn: r52724 2015-11-24 06:24:24 +0900

version.h の日付更新。

normal: r52725 2015-11-24 06:57:24 +0900

io.c に rb_gc_for_fd() という主に fd の数が飽和した時に GC を実行するための errno の判定と rb_gc() 呼び出しをまとめた関数を作り、ruby_dup() や rb_sysopen()、rb_fdopen()、rb_pipe() などの関数でこれを使うようにすることで一貫した処理を行うようにしています。 EMFILE, ENFILE の他に ENOMEM がかえってくることもあるということでそれもチェックに追加しています。もうひとつの狙いとしては errno は TLS として実装されていて、ただのローカル変数の参照よりもコストが高い可能性があるので、関数の引数に渡すことで errno は一度だけ参照してあとはローカル変数(引数ですが)として使いまわすことで最適化するという狙いもあるようです。まあでも関数呼び出しのコストはどうなんだろ…。 [ruby-core:71623] [Feature #11727]

normal: r52726 2015-11-24 07:50:53 +0900

r52725 で導入した rb_gc_for_fd() をさらに dir.c の dir_initialize() や拡張ライブラリ socket からも利用するようにしています。このため rb_gc_for_fd() は static 宣言を外して internal.h に宣言を追加しています。 [ruby-core:71623] [Feature #11727]

normal: r52727 2015-11-24 07:57:29 +0900

r52725 の rb_gc_for_fd() と似てますが拡張ライブラリ socket の Socket#accept で accept(2) がリソース不足のエラーをかえした時に GC を実行してリトライするようにしていたところで条件に errno=ENOMEM を追加しています。

nobu: r52728 2015-11-24 08:30:09 +0900

r52596 の NEWS ファイルへの Struct#dig の追加についてのエントリのチケットの参照が間違っていたので修正しています。 https://github.com/ruby/ruby/pull/1110 [Feature #11688]

nobu: r52729 2015-11-24 09:04:36 +0900

File の rdoc 用コメントのピリオドの抜けを修正しています。 https://github.com/ruby/ruby/pull/1111

nobu: r52730 2015-11-24 09:16:37 +0900

r52726 での internal.h への rb_gc_for_fd() の宣言追加の位置を export される位置に移動しています。

nobu: r52731 2015-11-24 09:17:11 +0900

BeOS のサポートを打ち切っています。 Haiku がサポートされているので、とのこと。 HaikuBeOS の後継というか BeOS を再現することを目指している OS なんですね。 https://github.com/ruby/ruby/pull/1112

hsbt: r52732 2015-11-24 10:00:15 +0900

rubygems の Gem::Installer の rdoc 用コメント(?) の typo 修正。 https://github.com/ruby/ruby/pull/1108

nobu: r52733 2015-11-24 16:12:43 +0900

r52547 での parse.y の ripper 用と本体用の切り分けのためのマクロの使いかたを変更した時の dispatch_scan_event() の定義を展開時に使ってる関数の名前を修正しています。

nobu: r52734 2015-11-24 16:12:56 +0900

parse.y で本体での利用時のみ使っていた token_info という構造体を ripper でも利用して、さらに token_seen などの bit field も ripper でも参照するようにして、magic comment がスクリプトの先頭にない時に警告を出す機能を ripper 経由でも使えるようにしています。こういう警告出るようになってたんですね。

kazu: r52735 2015-11-24 22:12:30 +0900

r52727 の ChangeLog エントリの関数名の typo 修正。