diff --git a/src/core/ev.c b/src/core/ev.c index ac1d3568..76c8d315 100644 --- a/src/core/ev.c +++ b/src/core/ev.c @@ -465,6 +465,7 @@ const JanetAbstractType janet_stream_type = { /* Register a fiber to resume with value */ void janet_schedule_signal(JanetFiber *fiber, Janet value, JanetSignal sig) { if (fiber->gc.flags & JANET_FIBER_EV_FLAG_CANCELED) return; + fiber->gc.flags |= JANET_FIBER_FLAG_ROOT; JanetTask t = { fiber, value, sig, ++fiber->sched_id }; if (sig == JANET_SIGNAL_ERROR) fiber->gc.flags |= JANET_FIBER_EV_FLAG_CANCELED; janet_q_push(&janet_vm.spawn, &t, sizeof(t)); diff --git a/src/core/vm.c b/src/core/vm.c index d43a4804..fb8c22f0 100644 --- a/src/core/vm.c +++ b/src/core/vm.c @@ -1338,8 +1338,9 @@ static JanetSignal janet_check_can_resume(JanetFiber *fiber, Janet *out, int is_ *out = janet_cstringv("C stack recursed too deeply"); return JANET_SIGNAL_ERROR; } - /* If a "task" fiber is trying to be used as a normal fiber, detect that. See bug #920. */ - if (janet_vm.stackn > 0 && (fiber->gc.flags & JANET_FIBER_FLAG_ROOT)) { + /* If a "task" fiber is trying to be used as a normal fiber, detect that. See bug #920. + * Fibers must be marked as root fibers manually, or by the ev scheduler. */ + if (janet_vm.fiber != NULL && (fiber->gc.flags & JANET_FIBER_FLAG_ROOT)) { #ifdef JANET_EV *out = janet_cstringv(is_cancel ? "cannot cancel root fiber, use ev/cancel" @@ -1351,9 +1352,6 @@ static JanetSignal janet_check_can_resume(JanetFiber *fiber, Janet *out, int is_ #endif return JANET_SIGNAL_ERROR; } - if (janet_vm.stackn == 0) { - fiber->gc.flags |= JANET_FIBER_FLAG_ROOT; - } if (old_status == JANET_STATUS_ALIVE || old_status == JANET_STATUS_DEAD || (old_status >= JANET_STATUS_USER0 && old_status <= JANET_STATUS_USER4) ||