From: "権兵衛 名無し" Date: 2010-08-02T16:14:43+09:00 Subject: [ruby-dev:41911] [Bug #3644] thread_win32.c / native_stop_timer_thread() がタイマースレッドの終了を待たずに帰ってきてしまう。 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