Bug #595 » ensure_fiber.patch
cont.c (working copy) | ||
---|---|---|
case 0:
|
||
return Qnil;
|
||
case 1:
|
||
case -2:
|
||
return argv[0];
|
||
default:
|
||
return rb_ary_new4(argc, argv);
|
||
... | ... | |
/* restored */
|
||
GetFiberPtr(th->fiber, fib);
|
||
if (fib->cont.argc == -1) rb_exc_raise(fib->cont.value);
|
||
else if (fib->cont.argc == -2) rb_throw_obj(fib->cont.value, Qnil);
|
||
return fib->cont.value;
|
||
}
|
||
else {
|
||
... | ... | |
return fib->status != TERMINATED ? Qtrue : Qfalse;
|
||
}
|
||
static VALUE
|
||
terminate_all_i(VALUE tag, VALUE fibval)
|
||
{
|
||
if (rb_fiber_alive_p(fibval)) {
|
||
return fiber_switch(fibval, -2, &tag, 0);
|
||
}
|
||
}
|
||
void
|
||
rb_fiber_terminate_all(rb_thread_t *th)
|
||
{
|
||
VALUE fibval, tag = rb_newobj();
|
||
rb_fiber_t *fib, *root_fib;
|
||
rb_thread_t *_th = GET_THREAD();
|
||
rb_thread_set_current(th);
|
||
fibval = th->root_fiber;
|
||
if (!RTEST(fibval)) return;
|
||
GetFiberPtr(fibval, root_fib);
|
||
fib = root_fib->prev_fiber;
|
||
while (fib != root_fib) {
|
||
rb_catch_obj(tag, terminate_all_i, fib->cont.self);
|
||
fib = fib->prev_fiber;
|
||
}
|
||
rb_thread_set_current(_th);
|
||
}
|
||
/*
|
||
* call-seq:
|
||
* fiber.resume(args, ...) -> obj
|
thread.c (working copy) | ||
---|---|---|
static void rb_mutex_unlock_all(mutex_t *mutex, rb_thread_t *th);
|
||
static void rb_mutex_abandon_all(mutex_t *mutexes);
|
||
void rb_fiber_terminate_all(rb_thread_t *th);
|
||
void
|
||
rb_thread_terminate_all(void)
|
||
... | ... | |
thread_debug("rb_thread_terminate_all (main thread: %p)\n", (void *)th);
|
||
st_foreach(vm->living_threads, terminate_i, (st_data_t)th);
|
||
rb_fiber_terminate_all(th);
|
||
while (!rb_thread_alone()) {
|
||
PUSH_TAG();
|
||
... | ... | |
thread_debug("rb_thread_execute_interrupts: %ld\n", err);
|
||
if (err == eKillSignal || err == eTerminateSignal) {
|
||
rb_fiber_terminate_all(th);
|
||
th->errinfo = INT2FIX(TAG_FATAL);
|
||
TH_JUMP_TAG(th, TAG_FATAL);
|
||
}
|