From: "ko1 (Koichi Sasada)" Date: 2012-11-26T09:22:13+09:00 Subject: [ruby-dev:46621] [ruby-trunk - Bug #4911] timer_thread_function() が thead unsafe Issue #4911 has been updated by ko1 (Koichi Sasada). Assignee changed from ko1 (Koichi Sasada) to kosaki (Motohiro KOSAKI) これは忘れてはいけなかった気がする. 小崎先生お願いします. ---------------------------------------- Bug #4911: timer_thread_function() が thead unsafe https://bugs.ruby-lang.org/issues/4911#change-33911 Author: kosaki (Motohiro KOSAKI) Status: Assigned Priority: Normal Assignee: kosaki (Motohiro KOSAKI) Category: core Target version: 2.0.0 ruby -v: trunk どうして、これを先月気づかなかったのだろう。という罪悪感があるのですが、 target 1.9.x で起票します。 timer_thread_function()で vm->running_thread にアクセスするのは thread unsafe な気がします 0.スレッドAがrunning_threadである 1.タイマースレッドがvm->running_threadをレジスタにのせる (レジスタにスレッドAのアドレスがのっかる) 2.コンテキストスイッチ 3.スレッドAが終了。スレッドBがrunning_threadになる 4.スレッドAの rb_thead_t がfreeされる 5.コンテキストスイッチ 6.そんなkとはつゆしらず、タイマースレッドはスレッドAの アドレスに対して th->interrupt_flag |= 1; するのでメモリ破壊 ---------------------------------------------------------- static void timer_thread_function(void *arg) { rb_vm_t *vm = GET_VM(); /* TODO: fix me for Multi-VM */ /* for time slice */ RUBY_VM_SET_TIMER_INTERRUPT(vm->running_thread); ※ここ /* check signal */ rb_threadptr_check_signal(vm->main_thread); } -- http://bugs.ruby-lang.org/