< :前の番号
^ :番号順リスト
> :次の番号
P :前の記事
N :次の記事
|<:スレッドの先頭
>|:次のスレッド
^ :返事先
_:自分への返事
>:同じ返事先を持つ記事(前)
<:同じ返事先を持つ記事(後)
---:分割してスレッド表示、再表示
| :分割して(縦)スレッド表示、再表示
~ :スレッドのフレーム消去
.:インデックス
..:インデックスのインデックス
自己解決しました
> あれ,そうだったっけ>メインスレッドだけ.そんなことないような.
これはただのうっかりなので、おいとくとして
(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 にならないから、タイマースレッドに
起こして貰えないケースでしょうか?