ruby-trunk-changes r45471 - r45486

今日は Windows 環境での fd リークのような現象の修正や、いくつかエラーメセージの作成に PRIsVALUE を利用するようにする恒例の修正がありました。

usa: r45471 2014-03-30 23:42:52 +0900

Windows 環境では Socket を開いてから system() などで子プロセスを起動するとデフォルトで子プロセスに継承されてしまって、親プロセスで閉じてもポートが使われたままになってしまう不具合を修正しています。 通常 ruby で開いた fd は close-on-exec フラグが立てられてこの問題が起きないようになっているのですが、Windows でソケットの作成をしていたところでこれに対応する処理が漏れていたところがあったようで、SetHandleInformation() という API を利用して close-on-exec と同様のフラグセットを行っているようです。 [ruby-core:61754] [Bug #9688]

nobu: r45477 2014-03-31 06:00:51 +0900

test/ruby/test_process.rb で子プロセスが成功したことをチェックするのに Process::Status#exitstatus が 0 であることをチェックしていた assertion を #success? が true であることをチェックするように変更しています。 exitstatus が 0 が成功を意味するかどうかは環境によるので、確実に成功を意味する success? を使うようにしています。

nobu: r45478 2014-03-31 06:00:53 +0900

Process.getrlimit と Process.setrlimit のリソース名が文字列指定された時に、不明なリソース名を ArgumentError のメッセージに埋め込む時に PRIsVALUE を利用して VALUE のまま埋め込むようにして、エンコーディングを保持したままにするようにしています。

svn: r45479 2014-03-31 06:00:55 +0900

version.h の日付更新。

nobu: r45480 2014-03-31 06:55:59 +0900

GC.stat や GC.latest_gc_info は必要な項目だけ取得するために Symbol で項目名を引数に渡せますが、この時不明なキー名が渡された時に SYM2ID() を呼んでいたため Symbol が pin down されて GC 対象外になっていたので、rb_sym2str() で dynamic Symbol のまま文字列化するようにしています。 またメッセージの生成に PRIsVALUE を利用することで、一時的に生成した String オブジェクトのバッファのみ利用することによる GC の mark 漏れがおきないようにしています。

normal: r45481 2014-03-31 10:34:19 +0900

r45384 で st.c の st_table のバッファサイズを素数サイズではなくて 2 の累乗にするようにしたのにあわせて st.c の コメントを一箇所修正しています。

nobu: r45482 2014-03-31 11:34:40 +0900

r45480に続いて RubyVM.stat でも取得する統計情報のキーを Symbol で渡して、そのキーが不明だった時に SYM2ID() を使っていたため Symbol が pin down されてしまう可能性があったのと、一時的に生成した String オブジェクトのバッファだけ rb_raise() に渡していた問題を rb_sym2str() を使って文字列化して pin down されないようにし、PRIsVALUE で埋め込むことで GC の mark 漏れによる不具合の可能性を回避しています。

nobu: r45483 2014-03-31 11:34:43 +0900

SignalException に不正なシグナル名を渡した時の ArgumentError のメッセージに渡されたシグナル名を埋め込む時に PRIsVALUE を使ってエンコーディングを保持するようにしています。 SignalException.new で任意のシグナル名を指定することができたんですねー、知らなかった。 SystemException.new に errno を渡すような感じですね。

kazu: r45484 2014-03-31 11:48:54 +0900

r45413 と r45425 の ChangeLog エントリの typo 修正。

usa: r45486 2014-03-31 17:24:30 +0900

test/ruby/memory_status.rb で fiddle が使えない時にかわりに dl を使う際に EnvUtil.suppress_warning を呼んでいたので、その前に test/ruby/envutil.rb を require_relative で読み込んでおくようにしています。