mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 13:54:21 +00:00
std.Io.Threaded: forward cancellation requests to awaited tasks
This commit is contained in:
parent
b052afd24b
commit
eb038ffbc1
1 changed files with 10 additions and 5 deletions
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue