ruby-trunk-changes r56459 - r56468

今日は主に EMFILE や ENFILE などのエラーで fd やファイルハンドラの不足の時に GC を行なってリトライする処理を Dir.glob や load/require で開く時にも適用するようにする変更などがありました。

kazu: r56459 2016-10-20 22:18:52 +0900

拡張ライブラリ digest の Digest::MD5 の rdoc 用コメントでサンプルコードの結果の digest が実際の値と異なっていたので修正しています。よく気がつきましたね。

nobu: r56460 2016-10-21 11:34:19 +0900

String#sub, String#gsub の rdoc 用コメントの typo 修正。 https://github.com/ruby/ruby/pull/1461

svn: r56461 2016-10-21 11:34:21 +0900

version.h の日付更新。

nobu: r56462 2016-10-21 11:38:04 +0900

require に fifo を渡した時の解放漏れについてのテストで GC.start を呼ぶのを FD 不足で LoadError が発生した時だけにするようにして負荷を下げるようにしています。

nobu: r56463 2016-10-21 16:06:27 +0900

require や load でファイルを開こうとして fd のリソース不足で失敗した場合に GC を実施してリトライする処理を本体のほうにも追加しています。てことは r56462 のテストの GC.start も不要になったってことですね。

nobu: r56464 2016-10-21 16:40:47 +0900

dir.c と io.c でシステムエラー時に rb_sys_fail() などのかわりに errno を引数で渡す rb_syserr_fail() を使うようにしています。途中で処理がはさまって errno が上書きされることがあるのでローカル変数に退避しておいてそれを渡すようにしています。

nobu: r56465 2016-10-21 16:40:48 +0900

dir.c の to_be_ignored() という関数マクロを inline 関数に定義しなおしています。引数に渡すのが errno の場合複数回 errno が評価される(errno は変数っぽいですが実際は thread local なのでもうちょっとコストのかかる処理に展開される可能性があるので、関数の引数に渡すことで1回だけ評価されるようにするためみたいです。

nobu: r56466 2016-10-21 16:40:50 +0900

rb_dir_s_empty_p() で errno が EMFILE や ENFILE の時に rb_gc() を呼んでいたのを rb_gc_for_fd() を使うようにリファクタリングしています。

nobu: r56467 2016-10-21 16:44:46 +0900

Dir.glob で fd のリソース不足によって失敗した時に rb_gc_for_fd() で GC で回収してリトライを試みるようにしています。

nobu: r56468 2016-10-21 16:55:09 +0900

r56467 で追加したテストは Process:RLIMIT_NOFILE が利用可能なプラットフォームでしか実行できなかったので、未定義な場合はテストメソッドを定義しないようにしています。