feature. See also
. The project being documented here (as the example) is the Zig library itself.
Uring.childKill
fn childKill(userdata: ?*anyopaque, child: *process.Child) void
File
Code
fn childKill(userdata: ?*anyopaque, child: *process.Child) void {
const ev: *Evented = @ptrCast(@alignCast(userdata));
var maybe_sync: CancelRegion.Sync.Maybe = .{ .sync = .initBlocked(ev) };
defer maybe_sync.deinit(ev);
defer ev.childCleanup(child);
const pid = child.id.?;
while (true) switch (linux.errno(linux.kill(pid, .TERM))) {
.SUCCESS => break,
.INTR => {},
.PERM => return,
.INVAL => |err| return errnoBug(err) catch {},
.SRCH => |err| return errnoBug(err) catch {},
else => |err| return unexpectedErrno(err) catch {},
};
maybe_sync.leaveSync(ev);
var info: linux.siginfo_t = undefined;
while (true) {
const thread = maybe_sync.cancel_region.awaitIoUring() catch |err| switch (err) {
error.Canceled => unreachable,
};
thread.enqueue().* = .{
.opcode = .WAITID,
.flags = 0,
.ioprio = 0,
.fd = pid,
.off = @intFromPtr(&info),
.addr = 0,
.len = @backingInt(linux.P.PID),
.rw_flags = 0,
.user_data = @intFromPtr(maybe_sync.cancel_region.fiber),
.buf_index = 0,
.personality = 0,
.splice_fd_in = linux.W.EXITED,
.addr3 = 0,
.resv = 0,
};
ev.yield(null, .nothing);
switch (maybe_sync.cancel_region.errno()) {
.SUCCESS => return,
.INTR, .CANCELED => {},
.CHILD => |err| return errnoBug(err) catch {},
else => |err| return unexpectedErrno(err) catch {},
}
}
}