zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit eb038ffbc1fb2eb936439127df8acf9b9dc080d0 (tree)
parent b052afd24bf42663ab937fab88eb072d3514519d
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Fri, 21 Nov 2025 15:18:19 -0800

std.Io.Threaded: forward cancellation requests to awaited tasks

Diffstat:
Mlib/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 @@ -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 {