ruby-trunk-changes r43243 - r43258

今日は ObjectSpace.after_gc_start_hook と GC.stress を併用した時の不具合の修正と、Symbol の GC mark 処理を RGenGC を意識して minor GC の時の mark 処理を省略できるようにしてパフォーマンス改善した変更がありました。
今日は Heroku 社のフルタイムコミッターの独壇場でした。

nobu:r43243 2013-10-11 01:28:56 +0900

43238 の st.c に st_keys() を追加して Hash#keys に利用していたのを revert しています。やはり st.c で VALUE を前提としたコードが入るのがダメってことみたいです。

svn:r43244 2013-10-11 01:29:02 +0900

version.h の日付更新。

nobu:r43245 2013-10-11 03:36:54 +0900

TracePoint の internal_event を使った ObjectSpace.after_gc_start_hook のフックを設定して GC.stress = true にするとフック呼び出しが際限なく続いてしまうのを修正しています。 postponed job の実行時にスレッドの割り込みを遅延させるようにしています。 [ruby-dev:47400] [Bug #8492]

nobu:r43246 2013-10-11 08:52:38 +0900

include/ruby/win32.h で finite() をプラットフォームの環境によって inline 関数として定義しなかった時にプロトタイプ宣言はしておくようにしています。 mingw で宣言がない場合があるらしいです。

nobu:r43247 2013-10-11 08:52:40 +0900

r43245 の vm_trace.c の変更で "clobbered by 'longjmp' or 'vfork'" の警告を抑制するために postponed job のインデックスを EXEC_TAG() の前で構造体 save に格納しておくようにしています。 EXEC_TAG() の戻り値を無視してしまっているんですが、フック内での例外などは無視するようになってるみたいだからまあいいのか。

nobu:r43248 2013-10-11 08:56:15 +0900

続いて r43245 の変更の追加で rb_thread_t::interrupt_mask のフラグを立てるのを RUBY_VM_SET_POSTPONED_JOB_INTERRUPT() というマクロを使うようにしていますが、これは interrupt_flag を立てるためのものだったので次で revert されています。

ko1:r43249 2013-10-11 15:23:19 +0900

と思ったら r43248 を revert しています。マクロは interrupt_flag を立てるもので、ここでは interrupt_mask を操作しているので間違っていました。

ko1:r43250 2013-10-11 16:54:26 +0900

r43245 で変更した vm_trace.c の rb_postponed_job_flush() をシンプルになるように書き直しています。 なんで current thread まで保存しているのかが謎だったんですけどやっぱりいらなかったんですね。

knu:r43251 2013-10-11 17:38:52 +0900

misc/ruby-electric.el に 2.0 というバージョンのものをマージしています。 ruby-electric.el には upstream があったんですね。 https://github.com/knu/ruby-electric.el
キーバインディングのカスタマイズ機能、自動インデント機能の拡張などがあったみたいです。

ko1:r43252 2013-10-11 18:12:45 +0900

引き続き r43245 で変更した rb_postponed_job_flush() の再修正。 rb_thread_t::interrupt_mask を戻すところで POSTPONED_JOB_INTERRUPT_MASK の部分だけ戻すようにビット演算を修正しています。

ko1:r43253 2013-10-11 18:13:18 +0900

拡張ライブラリ objspace の ObjectSpace.after_gc_start_hook= で再入を禁止して、postponed job 登録中にフックなどでさらに同じ postponed job を登録してしまうのを防いでいます。 [ruby-dev:47400] [Bug #8492] に対する修正だと思います。

knu:r43254 2013-10-11 19:31:03 +0900

misc/ruby-electric.el を 2.0.1 に更新しています。いくつか不具合があったのを修正しているそうです。

ko1:r43255 2013-10-11 20:45:38 +0900

Symbol の GC 時の mark 処理を RGenGC の minor GC 時の mark を省略できるようにしています。 Symbol の追加時にシンボルのテーブルの minor mark 済みのフラグを消して、minor mark は繰り返し mark 処理しないようにしています。 これで Symbol が大量にある状態での GC の負荷が軽くなって早くなるそうです。Symbol が 4万くらいあると 7.3sec -> 4.2sec になるとかそのくらい効くそうです。 Rails の起動が早くなるかもしれませんね。

ko1:r43256 2013-10-11 20:46:42 +0900

gc.c で tick を取得するために GCCインラインアセンブラを利用するところを defined(__GCC__) でチェックしていたのを defined(__GNUC__) に変更しています。

ko1:r43257 2013-10-11 21:00:35 +0900

gc.c の引数などで minor_gc という名前で minor GC の時の処理を指定していたのを full_mark という名称を(なので論理値は逆転しています)利用するように変更しています。

ko1:r43258 2013-10-11 21:06:25 +0900

r43255 で追加した rb_gc_mark_symbols() の引数は full_marking だったのでこれも合わせて full_mark という名称に変更しています。