From 0caf286a1a9f1f7fe13483d7adbf3f1357b12a1c Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 27 Oct 2025 14:08:51 -0700 Subject: [PATCH] std.Io.Threaded: don't skip executing canceled group closures --- lib/std/Io/Threaded.zig | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/std/Io/Threaded.zig b/lib/std/Io/Threaded.zig index 2af24dbf17..2bb88cbb78 100644 --- a/lib/std/Io/Threaded.zig +++ b/lib/std/Io/Threaded.zig @@ -566,10 +566,8 @@ const GroupClosure = struct { const reset_event: *ResetEvent = @ptrCast(&group.context); if (@cmpxchgStrong(CancelId, &closure.cancel_tid, .none, tid, .acq_rel, .acquire)) |cancel_tid| { assert(cancel_tid == .canceling); - // We already know the task is canceled before running the callback. Since all closures - // in a Group have void return type, we can return early. - syncFinish(group_state, reset_event); - return; + // Even though we already know the task is canceled, we must still + // run the closure in case there are side effects. } current_closure = closure; gc.func(group, gc.contextPointer());