Bug #3644: thread_win32.c / native_stop_timer_thread() がタイマースレッドの終了を待たずに帰ってきてしまう。
http://redmine.ruby-lang.org/issues/show/3644

起票者: 権兵衛 名無し
ステータス: Open, 優先度: Normal
Target version: 1.9.2
ruby -v: ruby 1.9.2dev (2010-07-11 revision 28618) [i386-mswin32_71]

はじめまして
以下の点、少し気になりましたので報告いたします。

thread_win32.c / native_stop_timer_thread() がタイマースレッドの終了を待た
ずに帰ってきてしまう。

thread_32.c 507 行目で定義されている native_thread_join() は
w32_wait_events() を呼び出す際に、待ち時間(第3パラメータ)に 0 を指定してい
るため、スレッドの終了を待たずに帰ってきてしまいます。INFINITE を指定すべ
きです。
native_thread_join() は私が見るかぎり、native_stop_timer_thread() からしか
呼び出されていないので、他への影響はないと思います。

--- thread_win32.c      2010-06-06 08:26:43.000000000
+++ thread_win32.c      2010-07-28 12:13:27.031424000
@@ -507,7 +507,7 @@
 static void
 native_thread_join(HANDLE th)
 {
-    w32_wait_events(&th, 1, 0, 0);
+    w32_wait_events(&th, 1, INFINITE, 0);
 }

win32 環境で ruby-1.9.2-rc2 ビルド中に miniruby.exe がまれにアクセス違反で
異常終了することがあります。インタプリタ終了時に呼び出される ruby_cleanup()
 内では、rb_thread_stop_timer_thread() でタイマースレッドを停止してから
ruby_vm_destruct() で vm 構造体を破棄していますが、スレッド停止を待たずに
処理を続けてしまうため、プロセス終了直前にタイマースレッドに制御がわたって
しまうと、タイマースレッドが vm 構造体を参照してしまいアクセス違反が発生す
るようです。


----------------------------------------
http://redmine.ruby-lang.org