From 4e8154cf8a09ef94e905bba9d95c1166ab0b0b23 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Sun, 5 Feb 2023 09:43:16 -0600 Subject: [PATCH] Fix ev/gather to cancel children on cancellation. Otherwise, we would be leaving zombie fibers around. --- src/boot/boot.janet | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/boot/boot.janet b/src/boot/boot.janet index 675a5262..6837059f 100644 --- a/src/boot/boot.janet +++ b/src/boot/boot.janet @@ -3583,13 +3583,16 @@ (,ev/deadline ,deadline nil ,f) (,resume ,f)))) + (defn- cancel-all [fibers reason] (each f fibers (if (fiber/can-resume? f) (ev/cancel f reason)))) + (defn- wait-for-fibers [chan fibers] - (repeat (length fibers) - (def [sig fiber] (ev/take chan)) - (unless (= sig :ok) - (each f fibers (ev/cancel f "sibling canceled")) - (propagate (fiber/last-value fiber) fiber)))) + (defer (cancel-all fibers "parent canceled") + (repeat (length fibers) + (def [sig fiber] (ev/take chan)) + (unless (= sig :ok) + (cancel-all fibers "sibling canceled") + (propagate (fiber/last-value fiber) fiber))))) (defmacro ev/gather ``