ruby-trunk-changes r44720 - r44728

今日はメインスレッドのスタックサイズ取得の再修正、fork/spawn/popen などのメソッドでの EINTR リトライ対応の漏れ修正、socket の open 時の最適化などがありました。

charliesome: r44720 2014-01-28 08:56:22 +0900

r37180 の callinfo を使った最適化の際に RubyVM::InstructionSequence の to_a で配列にしたものから戻す時のメソッド(公開されていない API)でブロックを表す Hash のキーが間違っていたため、元に戻せなくなっていたのを修正しています。 [ruby-core:60146] [Bug #9455]
この API は iseq.gem みたいな拡張ライブラリを使わないと利用できないのであまりテストもされてなくてたまに壊れますね。これも1年以上気づかれなかったみたいですし。

svn: r44721 2014-01-28 08:56:26 +0900

version.h の日付更新。

nobu: r44722 2014-01-28 15:09:58 +0900

rb_thread_t 構造体の machine_stack, machine_stack_src, machine_stack_size などのメンバを構造体のなかにまとめるリファクタリング。 デバッガでまとめて表示したいからだそうです。

zzak: r44723 2014-01-28 15:13:50 +0900

拡張ライブラリ zlib の Zlib.adler32 というメソッドの rdoc コメントにサンプルコードを追加しています。 チェックサムを計算するメソッドみたいですね。 [ruby-core:59340] [Bug #9307]

zzak: r44724 2014-01-28 15:19:19 +0900

標準添付ライブラリ set の Set#intersect? と Set#disjoint? の rdoc コメントにサンプルコードを追記しています。 [ruby-core:59432] [Bug #9331]

naruse: r44725 2014-01-28 15:29:51 +0900

r44712 の getrlimit(2) でメインスレッドのスタックサイズを取得しようとしたのは Linux でしか動かないので FreeBSD で動かなくなったとのことで、とりあえず Linux でのみ利用するように条件を強化しています。 [ruby-core:60113] [Bug #9454]

nobu: r44726 2014-01-28 16:33:20 +0900

r44712 および r44725 のさらに続きで ruby_init_stack() 内でスタックサイズを取得する方法の優先度を変更して get_main_stack() または get_stack() の利用を最優先にするようにしています。 また getrlimit(2) によるサイズの取得はどうやら Mac OS X がターゲットだったようで __APPLE__ が定義されていた時に利用するようにしています。 [ruby-core:60113] [Bug #9454] こちらのスレッドでも議論されています。 [ruby-dev:47917]

akr: r44727 2014-01-28 20:54:36 +0900

r44706 で fork や spawn、popen など子プロセスを生成する時の通信用 pipe の読み書きの時の EINTR でのリトライを行うようにしたら r44689 で追加したテストがエラーになることがあったのを修正しています。 r44706 はせっかく read_retry() を定義したのにそれを利用するように変更し漏れていたところがありました。 [ruby-core:56524] [Bug #8770]

akr: r44728 2014-01-28 23:37:34 +0900

拡張ライブラリ socket で socket(2) および socketpair(2) の flags に O_CLOEXEC が渡せるかどうかを errno=EINVAL のエラーがかえってくるかどうかで判定して、渡せなかったらあきらめて O_CLOEXEC なしで呼ぶという処理を毎回していたのを、一度実行した結果を憶えておいて次回からは無駄なシステムコール呼び出しをしないようにしています。 またエラー時にそれが実際に O_CLOEXEC の指定のせいなのかを fcntl() の F_GETFD でフラグを取得して判定することで正確に O_CLOEXEC の指定でエラーになったことを検出するようにしています。いつもコアなパッチを送ってくる Eric Wong さんのパッチです。すごいなー。 [ruby-core:59429] [Feature #9330]