mirror of
				https://github.com/janet-lang/janet
				synced 2025-10-31 07:33:01 +00:00 
			
		
		
		
	Merge pull request #1181 from chris-chambers/ev-gather-cancel
Ensure ev/gather fibers are fully canceled on error
This commit is contained in:
		| @@ -3663,17 +3663,21 @@ | |||||||
|          (,ev/deadline ,deadline nil ,f) |          (,ev/deadline ,deadline nil ,f) | ||||||
|          (,resume ,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 |   (defn- wait-for-fibers | ||||||
|     [chan fibers] |     [chan fibers] | ||||||
|     (defer (cancel-all fibers "parent canceled") |     (defer (cancel-all chan fibers "parent canceled") | ||||||
|       (repeat (length fibers) |       (repeat (length fibers) | ||||||
|         (def [sig fiber] (ev/take chan)) |         (def [sig fiber] (ev/take chan)) | ||||||
|         (if (= sig :ok) |         (if (= sig :ok) | ||||||
|           (put fibers fiber nil) |           (put fibers fiber nil) | ||||||
|           (do |           (do | ||||||
|             (cancel-all fibers "sibling canceled") |             (cancel-all chan fibers "sibling canceled") | ||||||
|             (propagate (fiber/last-value fiber) fiber)))))) |             (propagate (fiber/last-value fiber) fiber)))))) | ||||||
|  |  | ||||||
|   (defmacro ev/gather |   (defmacro ev/gather | ||||||
|   | |||||||
| @@ -168,6 +168,13 @@ | |||||||
| (assert (deep= @[] (ev/gather)) "ev/gather 2") | (assert (deep= @[] (ev/gather)) "ev/gather 2") | ||||||
| (assert-error "ev/gather 3" (ev/gather 1 2 (error 3))) | (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 | # Net testing | ||||||
| # 2904c19ed | # 2904c19ed | ||||||
| (repeat 10 | (repeat 10 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Calvin Rose
					Calvin Rose