ruby-trunk-changes r42635 - r42644

今日は正規表現リテラルの o オプション(/#{expr}/o) の不具合修正や GC::Profiler の一部の環境での不具合修正、Process.clock_gettime の clock_id に受け付ける定数の追加などがありました。

ko1:r42635 2013-08-21 02:32:18 +0900

GCデバッグ用の情報を出力する関数 rb_gcdebug_print_obj_condition() でオブジェクトの状態の表示を追加しています。

svn:r42636 2013-08-21 02:32:23 +0900

version.h の日付更新。

ko1:r42637 2013-08-21 02:41:13 +0900

正規表現の o オプション /#{expr}/o は正規表現リテラル内の式展開を最初の1回だけ実行して、次からはその結果を使いまわすという挙動を指定するオプションなのですが、展開する式の実行中に例外などの大域脱出が発生すると評価中の状態のままになって再度評価しようとするとデッドロックするという不具合があり、VM の命令に once を導入して修正しています。かわりに onceinlinecache 命令を削除しています。またこの影響から InstructionSequence の minor version が上がって 2.0 から 2.1 になっています。普通に使うぶんには全く影響ないでしょうけど。 [ruby-dev:45923] [Bug #6701]

nobu:r42638 2013-08-21 15:51:51 +0900

insns.def の getinlinecache, once, opt_case_dispatch 命令のコメントの英語の description を詳しくしています。

akr:r42639 2013-08-21 17:34:48 +0900

GC::Profiler で GC 時間を取得するのに clock_gettime(2) と CLOCK_PROCESS_CPUTIME_ID が定義されていたらこれを使うようにしていたのですが、定義されていても実際に利用しようとするとエラーになる環境があるらしく(SmartOS)、常に clock_gettime() を使うのではなくてエラーになったら getrusage(2) を利用するように切り替えるようにしています。 [ruby-core:56762] [Bug #8805]

akr:r42640 2013-08-21 19:18:37 +0900

Process.clock_gettime の clock_id で CLOCK_PROCESS_CPUTIME_ID のエミュレーション

:SUS_GETRUSAGE_SELF_USER_AND_SYSTEM_TIME_CLOCK_PROCESS_CPUTIME_ID

(長すぎてはてなダイアリーでうまく表示されないので pre 記法にしてみました)をサポートし、getrusage(2) を使ってエミュレートするようにしています。

akr:r42641 2013-08-21 19:31:59 +0900

Process.clock_gettime の clock_id に受け付けるシンボルの :POSIX_GETTIMEOFDAY_CLOCK_REALTIME を :SUS_GETTIMEOFDAY_CLOCK_REALTIME に改名しています。

akr:r42642 2013-08-21 20:36:43 +0900

process.c の get_clk_tck() から sysconf(_SC_CLK_TCK) を使って1秒あたりのクロック数を取得する処理を get_clk_tck() として分離して Process.clock_gettime の実装で clock_id の CLOCK_PROCESS_CPUTIME_ID のエミュレーションに使って

:POSIX_TIMES_CALLING_PROCESS_USER_AND_SYSTEM_TIME_CLOCK_PROCESS_CPUTIME_ID

という clock_id を受け付けるように追加しています。シンボルが長い!*1 内容は times(3) でユーザ時間をシステム時間を合計してクロック数で割って計算しています。

akr:r42643 2013-08-21 21:05:29 +0900

process.c の rb_proc_times() で rb_struct_new() に渡す引数を volatile VALUE な変数に代入して保護していたのを RB_GC_GUARD() を使うように書き換えています。この保護不要そうに見えるのですが、[ruby-dev:47650] によれば [ruby-dev:19206] r3274 で Windows XP での不具合修正として入れられたものだそうです。はて。

akr:r42644 2013-08-21 22:33:59 +0900

Process.clock_gettime の clock_id に CLOCK_PROCESS_CPUTIME_ID をエミュレートした :ISO_C_CLOCK_CLOCK_PROCESS_CPUTIME_ID を受け付けるようにしています。 clock(3) という標準ライブラリ関数を使ってエミュレートしています。

*1: 長すぎてはてなダイアリーでうまく表示できないので pre 記法を使ってみました