mirror of
https://github.com/ziglang/zig.git
synced 2025-12-06 06:13:07 +00:00
std.Io.Threaded: forward cancellation requests to awaited tasks
This commit is contained in:
parent
b052afd24b
commit
eb038ffbc1
@ -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…
x
Reference in New Issue
Block a user