ruby-trunk-changes r51537 - r51551

今日は ID 専用のテーブルという内部的な実装の最適化のための大きな変更がありました。

normal: r51537 2015-08-12 05:35:12 +0900

parse.y で宣言されている関数の引数についている volatile 修飾子を削っています。おそらく最適化による GC mark 漏れの対策だったのだと思いますが(かなり昔 gcc の不具合で最適化がなかなか抑制できなくて volatile つけまくってた時があったような気がします)、もう RB_GC_GUARD() で保護されているので不要になっていました。 [ruby-core:70323] [misc #11431]

svn: r51538 2015-08-12 05:35:28 +0900

version.h の日付更新。

nobu: r51539 2015-08-12 12:50:59 +0900

テスト用のユーティリティ EnvUtil の invoke_rubyタイムアウト時に子プロセスの情報も出力するようにしています。

nobu: r51540 2015-08-12 12:51:01 +0900

finalizer 実行中のシグナルでのハングアップのテストで5秒待ってから子プロセスにシグナル送信して止めるようにしていたのを EnvUtil.invoke_rubyタイムアウト処理にまかせるようにしています。

ko1: r51541 2015-08-12 17:43:55 +0900

ID をキーとして管理するテーブルに st_table を利用していましたが、ID のみの場合はメモリや処理時間の無駄があるので、ID をキーとする専用のテーブル st_id_table というのを導入して、symbol や method entry などなどでこれを利用するようにしています。 st_id_table の実装は ID_TABLE_IMPL というマクロで切り換えることができるようにしていて、デフォルトは小さい時は配列で要素数が多くなってきたらオープンアドレス法のハッシュテーブルという実装みたいです。ずいぶんたくさん実装を用意してますね…。 [ruby-core:70257] [Feature #11420]
ruby-dev でデータ構造/アルゴリズムの募集をしていたので、腕に憶えのある方は挑戦してみてはどうでしょう。どっちかというと実際の使われかたに近いようベンチマークを作るのが重要なのかもしれませんけど。 [ruby-dev:49209]

svn: r51542 2015-08-12 17:44:34 +0900

r51541 の行末の空白除去。

svn: r51543 2015-08-12 17:44:35 +0900

r51541 で新規追加されたファイルの svn property 設定。

ko1: r51544 2015-08-12 17:59:27 +0900

r51541 で導入した ID 専用テーブルへの移行に伴ない、コールバック関数の戻り値の ST_CONTINUE などを ID_TABLE_CONTINUE などへ定数の変更を追加しています。

ko1: r51545 2015-08-12 18:00:56 +0900

もう一箇所 ST_CONTINUE から ID_TABLE_CONTINUE への変更。

normal: r51546 2015-08-12 21:16:29 +0900

compile.c の iseq_build_callinfo_from_hash() から rb_call_info_kw_arg_t+α のキーワード引数のためのメモリ領域のサイズ計算部分を rb_call_info_kw_arg_bytes() という inline 関数として vm_core.h に切り出しています。これは後で iseq.c で再利用するためみたいです。

normal: r51547 2015-08-12 21:18:51 +0900

T_IMEMO 型のオブジェクトである ISeq を参照する wrapper としてのオブジェクトである RubyVM::InstructionSequence を TypedData 型のオブジェクトとして実装しています。 また r51546 で切り出した rb_call_info_kw_arg_bytes() を利用しています。動機は ObjectSpace.memsize_of で正確なメモリ使用量を返すようにすることみたいです。 [ruby-core:70344] [Feature #11435]

ko1: r51548 2015-08-12 21:51:56 +0900

r51541 で導入した ID 専用テーブルの insert の実装で一時利用したメモリを解放していなかった不具合を修正しています。

ko1: r51549 2015-08-12 21:59:29 +0900

r51541 で導入した ID 専用テーブルの実装を切り替えるためのマクロ IMPL() で引数に "_xxx" のようにアンダースコアではじまる名前を指定するように変更しています。 jemalloc を使っていると free が je_free に置換されてしまうからだそうです。

nobu: r51550 2015-08-12 22:20:21 +0900

r51541 の ID 専用テーブルの実装切り替えのマクロ IMPL() で、名前に "id_table" を含めるのを展開していった先の IMPL2() でやっていたのを IMPL() のところで埋め込んでおくようにしています。はて、なぜだろう。というかこういう書きかたできるんですね(## による識別子の連結をさらにマクロの引数にする)。

nobu: r51551 2015-08-12 22:25:13 +0900

finalizer 実行中のシグナル受信のテストでハングアップした子プロセスにバックトレースを吐かせるため、タイムアウト時に送信するシグナルに SIGABRT を指定しています。