From eb038ffbc1fb2eb936439127df8acf9b9dc080d0 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Fri, 21 Nov 2025 15:18:19 -0800 Subject: [PATCH] std.Io.Threaded: forward cancellation requests to awaited tasks --- lib/std/Io/Threaded.zig | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/lib/std/Io/Threaded.zig b/lib/std/Io/Threaded.zig index 51c0139b87..af832dab74 100644 --- a/lib/std/Io/Threaded.zig +++ b/lib/std/Io/Threaded.zig @@ -478,10 +478,15 @@ const AsyncClosure = struct { return ac; } - fn waitAndDeinit(ac: *AsyncClosure, gpa: Allocator, result: []u8) void { - ac.reset_event.waitUncancelable(); + fn waitAndDeinit(ac: *AsyncClosure, t: *Threaded, result: []u8) void { + ac.reset_event.wait(t) catch |err| switch (err) { + error.Canceled => { + ac.closure.requestCancel(); + ac.reset_event.waitUncancelable(); + }, + }; @memcpy(result, ac.resultPointer()[0..result.len]); - ac.deinit(gpa); + ac.deinit(t.allocator); } fn deinit(ac: *AsyncClosure, gpa: Allocator) void { @@ -796,7 +801,7 @@ fn await( _ = result_alignment; const t: *Threaded = @ptrCast(@alignCast(userdata)); const closure: *AsyncClosure = @ptrCast(@alignCast(any_future)); - closure.waitAndDeinit(t.allocator, result); + closure.waitAndDeinit(t, result); } fn cancel( @@ -809,7 +814,7 @@ fn cancel( const t: *Threaded = @ptrCast(@alignCast(userdata)); const ac: *AsyncClosure = @ptrCast(@alignCast(any_future)); ac.closure.requestCancel(); - ac.waitAndDeinit(t.allocator, result); + ac.waitAndDeinit(t, result); } fn cancelRequested(userdata: ?*anyopaque) bool {