Bug #4072 » sleep_forever.patch
| thread.c | ||
|---|---|---|
|
sleep_forever(rb_thread_t *th, int deadlockable)
|
||
|
{
|
||
|
enum rb_thread_status prev_status = th->status;
|
||
|
enum rb_thread_status status = deadlockable ? THREAD_STOPPED_FOREVER : THREAD_STOPPED;
|
||
|
th->status = deadlockable ? THREAD_STOPPED_FOREVER : THREAD_STOPPED;
|
||
|
th->status = status;
|
||
|
do {
|
||
|
if (deadlockable) {
|
||
|
th->vm->sleeper++;
|
||
| ... | ... | |
|
th->vm->sleeper--;
|
||
|
}
|
||
|
RUBY_VM_CHECK_INTS();
|
||
|
} while (th->status == THREAD_STOPPED_FOREVER);
|
||
|
} while (th->status == status);
|
||
|
th->status = prev_status;
|
||
|
}
|
||
| ... | ... | |
|
/* 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);
|
||
|
thread_status_name(mth->status), sig);
|
||
|
mth->exec_signal = sig;
|
||
|
if (mth->status != THREAD_KILLED) mth->status = THREAD_RUNNABLE;
|
||
|
rb_threadptr_interrupt(mth);
|
||
|
mth->status = prev_status;
|
||
|
}
|
||
|
}
|
||