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 {...@@ -478,10 +478,15 @@ const AsyncClosure = struct {
478 return ac;478 return ac;
479 }479 }
480480
481 fn waitAndDeinit(ac: *AsyncClosure, gpa: Allocator, result: []u8) void {481 fn waitAndDeinit(ac: *AsyncClosure, t: *Threaded, result: []u8) void {
482 ac.reset_event.waitUncancelable();482 ac.reset_event.wait(t) catch |err| switch (err) {
483 error.Canceled => {
484 ac.closure.requestCancel();
485 ac.reset_event.waitUncancelable();
486 },
487 };
483 @memcpy(result, ac.resultPointer()[0..result.len]);488 @memcpy(result, ac.resultPointer()[0..result.len]);
484 ac.deinit(gpa);489 ac.deinit(t.allocator);
485 }490 }
486491
487 fn deinit(ac: *AsyncClosure, gpa: Allocator) void {492 fn deinit(ac: *AsyncClosure, gpa: Allocator) void {
...@@ -796,7 +801,7 @@ fn await(...@@ -796,7 +801,7 @@ fn await(
796 _ = result_alignment;801 _ = result_alignment;
797 const t: *Threaded = @ptrCast(@alignCast(userdata));802 const t: *Threaded = @ptrCast(@alignCast(userdata));
798 const closure: *AsyncClosure = @ptrCast(@alignCast(any_future));803 const closure: *AsyncClosure = @ptrCast(@alignCast(any_future));
799 closure.waitAndDeinit(t.allocator, result);804 closure.waitAndDeinit(t, result);
800}805}
801806
802fn cancel(807fn cancel(
...@@ -809,7 +814,7 @@ fn cancel(...@@ -809,7 +814,7 @@ fn cancel(
809 const t: *Threaded = @ptrCast(@alignCast(userdata));814 const t: *Threaded = @ptrCast(@alignCast(userdata));
810 const ac: *AsyncClosure = @ptrCast(@alignCast(any_future));815 const ac: *AsyncClosure = @ptrCast(@alignCast(any_future));
811 ac.closure.requestCancel();816 ac.closure.requestCancel();
812 ac.waitAndDeinit(t.allocator, result);817 ac.waitAndDeinit(t, result);
813}818}
814819
815fn cancelRequested(userdata: ?*anyopaque) bool {820fn cancelRequested(userdata: ?*anyopaque) bool {