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

This commit is contained in:
Andrew Kelley 2025-11-21 15:18:19 -08:00
parent b052afd24b
commit eb038ffbc1

View file

@ -478,10 +478,15 @@ const AsyncClosure = struct {
return ac; return ac;
} }
fn waitAndDeinit(ac: *AsyncClosure, gpa: Allocator, result: []u8) void { fn waitAndDeinit(ac: *AsyncClosure, t: *Threaded, result: []u8) void {
ac.reset_event.waitUncancelable(); 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]); @memcpy(result, ac.resultPointer()[0..result.len]);
ac.deinit(gpa); ac.deinit(t.allocator);
} }
fn deinit(ac: *AsyncClosure, gpa: Allocator) void { fn deinit(ac: *AsyncClosure, gpa: Allocator) void {
@ -796,7 +801,7 @@ fn await(
_ = result_alignment; _ = result_alignment;
const t: *Threaded = @ptrCast(@alignCast(userdata)); const t: *Threaded = @ptrCast(@alignCast(userdata));
const closure: *AsyncClosure = @ptrCast(@alignCast(any_future)); const closure: *AsyncClosure = @ptrCast(@alignCast(any_future));
closure.waitAndDeinit(t.allocator, result); closure.waitAndDeinit(t, result);
} }
fn cancel( fn cancel(
@ -809,7 +814,7 @@ fn cancel(
const t: *Threaded = @ptrCast(@alignCast(userdata)); const t: *Threaded = @ptrCast(@alignCast(userdata));
const ac: *AsyncClosure = @ptrCast(@alignCast(any_future)); const ac: *AsyncClosure = @ptrCast(@alignCast(any_future));
ac.closure.requestCancel(); ac.closure.requestCancel();
ac.waitAndDeinit(t.allocator, result); ac.waitAndDeinit(t, result);
} }
fn cancelRequested(userdata: ?*anyopaque) bool { fn cancelRequested(userdata: ?*anyopaque) bool {