diff --git a/src/core/ev.c b/src/core/ev.c index e95c324b..4c4f72dd 100644 --- a/src/core/ev.c +++ b/src/core/ev.c @@ -403,7 +403,10 @@ void janet_schedule(JanetFiber *fiber, Janet value) { void janet_fiber_did_resume(JanetFiber *fiber) { /* Cancel any pending fibers */ - if (fiber->waiting) janet_unlisten(fiber->waiting); + if (fiber->waiting) { + fiber->waiting->machine(fiber->waiting, JANET_ASYNC_EVENT_CANCEL); + janet_unlisten(fiber->waiting); + } } /* Mark all pending tasks */ @@ -786,8 +789,10 @@ void janet_loop1(void) { while ((has_timeout = peek_timeout(&to)) && to.fiber->sched_id != to.sched_id) { pop_timeout(0); } - /* Run polling implementation */ - janet_loop1_impl(has_timeout, to.when); + /* Run polling implementation only if pending timeouts or pending events */ + if (janet_vm_tq_count || janet_vm_listener_count) { + janet_loop1_impl(has_timeout, to.when); + } } } diff --git a/src/include/janet.h b/src/include/janet.h index 46bd0cb6..a9912cd6 100644 --- a/src/include/janet.h +++ b/src/include/janet.h @@ -517,7 +517,7 @@ typedef enum { JANET_ASYNC_EVENT_HUP, JANET_ASYNC_EVENT_READ, JANET_ASYNC_EVENT_WRITE, - JANET_ASYNC_EVENT_TIMEOUT, + JANET_ASYNC_EVENT_CANCEL, JANET_ASYNC_EVENT_COMPLETE, /* Used on windows for IOCP */ JANET_ASYNC_EVENT_USER } JanetAsyncEvent; diff --git a/test/suite0009.janet b/test/suite0009.janet index 5c444b46..b6670442 100644 --- a/test/suite0009.janet +++ b/test/suite0009.janet @@ -65,4 +65,13 @@ (ev/close writer) (ev/take chan)) +(var result nil) +(def fiber + (ev/spawn + (set result (protect (ev/sleep 0.4))) + (assert (= result '(false "boop")) "ev/cancel 1"))) +(ev/sleep 0.1) +(ev/cancel fiber "boop") +(ev/sleep 0.1) + (end-suite)