From 53447e9d0b5620ec2fd0738063f5adce7d7a55a9 Mon Sep 17 00:00:00 2001 From: Christopher Chambers Date: Sun, 4 Jun 2023 09:59:10 -0400 Subject: [PATCH] Ensure ev/gather fibers are fully canceled on error. --- src/boot/boot.janet | 10 +++++++--- test/suite-ev.janet | 7 +++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/boot/boot.janet b/src/boot/boot.janet index e283c508..44584836 100644 --- a/src/boot/boot.janet +++ b/src/boot/boot.janet @@ -3663,17 +3663,21 @@ (,ev/deadline ,deadline nil ,f) (,resume ,f)))) - (defn- cancel-all [fibers reason] (each f fibers (ev/cancel f reason) (put fibers f nil))) + (defn- cancel-all [chan fibers reason] + (each f fibers (ev/cancel f reason)) + (let [n (length fibers)] + (table/clear fibers) + (repeat n (ev/take chan)))) (defn- wait-for-fibers [chan fibers] - (defer (cancel-all fibers "parent canceled") + (defer (cancel-all chan fibers "parent canceled") (repeat (length fibers) (def [sig fiber] (ev/take chan)) (if (= sig :ok) (put fibers fiber nil) (do - (cancel-all fibers "sibling canceled") + (cancel-all chan fibers "sibling canceled") (propagate (fiber/last-value fiber) fiber)))))) (defmacro ev/gather diff --git a/test/suite-ev.janet b/test/suite-ev.janet index b2140f5f..d076355e 100644 --- a/test/suite-ev.janet +++ b/test/suite-ev.janet @@ -168,6 +168,13 @@ (assert (deep= @[] (ev/gather)) "ev/gather 2") (assert-error "ev/gather 3" (ev/gather 1 2 (error 3))) +(var cancel-counter 0) +(assert-error "ev/gather 4.1" (ev/gather + (defer (++ cancel-counter) (ev/take (ev/chan))) + (defer (++ cancel-counter) (ev/take (ev/chan))) + (error :oops))) +(assert (= cancel-counter 2) "ev/gather 4.2") + # Net testing # 2904c19ed (repeat 10