ruby-trunk-changes r34162 - r34165

2011年最後の ruby trunk changes です。今日は LLVM 向けの最適化避け、rb_barrier_t の不具合修正などがありました。
今年は 3155 コミットありました。コミット数 1位はもちろんわれらがパッチモンスター nobu (583 commits), 2位は svn さん(348 commits)、3位は kosaki さん(332 commits)でした。コミッターのみなさん今年もお疲れさまでした!

naruse:r34162 2011-12-31 07:25:13 +0900

vm.c の vm_exec() でコンパイラLLVM の時に rb_thread_t *th の内容をコピーするローカル変数を追加しています。よくわかりませんが clang での最適化の影響を抑制するためとのこと。clang のバグ?

naruse:r34163 2011-12-31 07:25:16 +0900

複数のスレッドからの require を 1つの Thread のみで処理するための rb_barrier_t の処理待ち Thread 数を struct RBasic の flags の空き部分(20bit)に埋め込むようにして、 rb_mutex_t の cond_waiting を利用するのはやめています。cond_waiting はインクリメントされる前に GVL が解放されるため、これを見て判断しようとすると race condition が発生するようです。このため rb_barrier_t 自体に待っている Thread 数を格納して rb_mutex_lock()前後で increment/decrement するようにしています。 flags の操作は atomic ではありませんがこの部分は GVL を確保した状態で行われるので大丈夫なはず。 [ruby-dev:45002] [Bug #5768]

svn:r34164 2011-12-31 07:25:18 +0900

version.h の日付更新。