mirror of
https://github.com/janet-lang/janet
synced 2024-11-24 17:27:18 +00:00
Add JANET_ASYNC_EVENT_CANCEL
also fix bug that could cause event loop to hang.
This commit is contained in:
parent
f9d0eb47b7
commit
cff52ded58
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user