自己解決しました > あれ,そうだったっけ>メインスレッドだけ.そんなことないような. これはただのうっかりなので、おいとくとして (RUBY_VM_SET_TIMER_INTERRUPT(vm->running_thread) なので自明だった) > いや、あの。補足をお願いして良いですか。の返事がこれだとESP能力を > 要求されてる感じです。ボスケテ > > 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); > > void > rb_threadptr_check_signal(rb_thread_t *mth) > { > int sig; > > /* mth must be main_thread */ > > if (!mth->exec_signal && (sig = rb_get_next_signal()) > 0) { > enum rb_thread_status prev_status = mth->status; > thread_debug("main_thread: %s, sig: %d\n", > thread_status_name(prev_status), sig); > mth->exec_signal = sig; > if (mth->status != THREAD_KILLED) mth->status = THREAD_RUNNABLE; > rb_threadptr_interrupt(mth); > mth->status = prev_status; > } > } > > なので、メインスレッドが定期的に rb_threadptr_interrupt()呼ばれてるのは > 自明なんですが、他のスレッドはどこからでしょうか? タイマースレッドがrunning thread に配送されて、rb_threadptr_execute_interrupts_rec()で /* signal handling */ if (th->exec_signal) { (1) } /* exception from another thread */ if (th->thrown_errinfo) { (2) } if (finalizer_interrupt) { (3) rb_gc_finalize_deferred(); } のようになっているから、(1)と(2)はRUBY_VM_INTERRUPTED()を使っていないのでセーフ。 (3)は次のgcの時にもう一回フラグが立つからセーフということですね? ということは危ないのは RUBY_VM_SET_INTERRUPT() がロストしたときに、タイムアウトなしの スリープをしていて、vm->running_thread にならないから、タイマースレッドに 起こして貰えないケースでしょうか?