authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-11-21 15:18:19-08:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-11-21 19:54:41-08:00
logeb038ffbc1fb2eb936439127df8acf9b9dc080d0
treef0af7a0b4ce72c4480d3df24bdaf0de82d436649
parentb052afd24bf42663ab937fab88eb072d3514519d

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


1 files changed, 10 insertions(+), 5 deletions(-)

lib/std/Io/Threaded.zig+10-5
......@@ -478,10 +478,15 @@ const AsyncClosure = struct {
478478 return ac;
479479 }
480480
481 fn waitAndDeinit(ac: *AsyncClosure, gpa: Allocator, result: []u8) void {
482 ac.reset_event.waitUncancelable();
481 fn waitAndDeinit(ac: *AsyncClosure, t: *Threaded, result: []u8) void {
482 ac.reset_event.wait(t) catch |err| switch (err) {
483 error.Canceled => {
484 ac.closure.requestCancel();
485 ac.reset_event.waitUncancelable();
486 },
487 };
483488 @memcpy(result, ac.resultPointer()[0..result.len]);
484 ac.deinit(gpa);
489 ac.deinit(t.allocator);
485490 }
486491
487492 fn deinit(ac: *AsyncClosure, gpa: Allocator) void {
......@@ -796,7 +801,7 @@ fn await(
796801 _ = result_alignment;
797802 const t: *Threaded = @ptrCast(@alignCast(userdata));
798803 const closure: *AsyncClosure = @ptrCast(@alignCast(any_future));
799 closure.waitAndDeinit(t.allocator, result);
804 closure.waitAndDeinit(t, result);
800805}
801806
802807fn cancel(
......@@ -809,7 +814,7 @@ fn cancel(
809814 const t: *Threaded = @ptrCast(@alignCast(userdata));
810815 const ac: *AsyncClosure = @ptrCast(@alignCast(any_future));
811816 ac.closure.requestCancel();
812 ac.waitAndDeinit(t.allocator, result);
817 ac.waitAndDeinit(t, result);
813818}
814819
815820fn cancelRequested(userdata: ?*anyopaque) bool {