ruby-trunk-changes r42555 - r42565

今日は Process.clock_gettime の Windows 版対応と、Windows での IO のパフォーマンスのため fsync() を呼ぶタイミングをいくつか削っています。

zzak:r42555 2013-08-15 02:34:40 +0900

Hash#[] や Hash#store のキーの rdoc コメントの freeze 化などの注釈部分の体裁を整え、String をキーとして渡した時の挙動のサンプルを追加しています。 https://github.com/ruby/ruby/pull/382

svn:r42556 2013-08-15 02:34:48 +0900

version.h の日付更新。

usa:r42557 2013-08-15 14:32:02 +0900

r42504 で追加された Process.clock_gettime メソッドの Windows 版の対応が追加されています。 Windows では当然(?) clock_gettime(2) はないので、gettimeofday(2) と QueryPerformanceFrequency() と QueryPerformanceCounter() を使って CLOCK_REALTIME と CLOCK_MONOTONIC には対応しています。 freq.QuadPart の大きさで分岐しているのは不要な時は浮動小数点数の演算を避けてパフォーマンスを良くするためでしょうか。常に浮動小数点数を使っても演算結果は変わらない……と思ったけど整数のほうがオーバフローには強いのかも。 LARGE_INTEGER はどうも LONG_LONG らしいので double よりも精度があるので。ただ乗算の左辺は freq.QuadPart で mod を取ってるので結果は 1000000000 未満になるはずなのでオーバフローは大丈夫なはず。やっぱり性能のためでしょう。
[追記]じゃなくて、freq が大きいと先に 1000000000 をかけるとオーバフローしてしまうためしかたなく除算しておく必要があるために浮動小数点数を経由しないといけないということでした。[/追記]

akr:r42558 2013-08-15 15:50:37 +0900

Process.clock_gettime の rdoc コメントに clock_id に渡せる定数 CLOCK_THREAD_CPUTIME_ID をサポートしているプラットフォームとして FreeBSD 7.1 を追加しています。 参考URL: http://www.freebsd.org/releases/7.1R/relnotes.html

usa:r42559 2013-08-15 16:32:07 +0900

FileUtils#rmdir のテストで "/" を消そうとしてみるテストで Dir.rmdir "/" が Errno::ENOTEMPTY を発生させた時に FileUtils.rmdir "/" を呼ぶ assertion を実行しないようにしています。 FileUtils は Errno::ENOTEMPTY を無視するので、とのこと。直下のコメントで Errno::ENOENT も同様に無視されると書いてある(実際無視される)のですがそっちはコメントはあるのに元々 rescue されていませんね。はて。

usa:r42560 2013-08-15 17:01:28 +0900

IO#rewind で Windows 版では fsync(2) を呼ぶようにしていたのを削除しています。 PStore のテストが Windows で時間がかかっていた(r42552 と r42554 でタイムアウトを延ばしていたやつ)のを改善するためだと思われます。

ko1:r42561 2013-08-15 17:46:53 +0900

gc.c の gc_lazy_sweep() で heap_increment() を呼び出していたのを削除しています。ここで呼び出しても heap_inc が 0 のため何も実行されないはずなので不要だったとのこと。

usa:r42562 2013-08-15 18:41:40 +0900

r42557 の Windows 版の clock_gettime(2) のエミュレーションの clock_id が CLOCK_MONOTONIC の時の精度を改善。整数版の演算時にクロック周波数で割る前に 1000000000 をかけておくようにしています。オーバフローは大丈夫かなと思ってみたところ freq.QuadPart は LONG_LONG でたぶん 128bit 整数と思われるので大丈夫ではないかと思われます。

nobu:r42563 2013-08-15 20:09:26 +0900

parse.y のキーワード引数の構文のところに新しい中間規則を追加していくつかの規則のアクションの共通部分を括り出すリファクタリングです。

usa:r42564 2013-08-15 20:53:41 +0900

Windows 版の rb_io_flush() に引数を追加して rb_io_flush_raw() という関数を追加(改名)して引数の指定によって fsync(2) を実行しないようにできるようにしています。そして IO#truncate で Windows 版では rb_io_flush_raw() を呼んで fsync(2) を実行しないようにしています。これも r42552 と r42554 でタイムアウトを延ばしていた PStore のテストで Windows だと遅い問題の対処だと思います。タイムアウト値も元に戻しています。

usa:r42565 2013-08-15 21:38:02 +0900

r42564 の変更で File#truncate してすぐに別スレッドで File.size をチェックしても truncate したサイズになっていることを確認するテストを追加しています。