feature. See also
. The project being documented here (as the example) is the Zig library itself.
Uring.childWait
fn childWait(userdata: ?*anyopaque, child: *process.Child) process.Child.WaitError!process.Child.Term
File
Code
fn childWait(userdata: ?*anyopaque, child: *process.Child) process.Child.WaitError!process.Child.Term {
const ev: *Evented = @ptrCast(@alignCast(userdata));
var maybe_sync: CancelRegion.Sync.Maybe = .{ .cancel_region = .init() };
defer maybe_sync.deinit(ev);
defer ev.childCleanup(child);
const pid = child.id.?;
var info: linux.siginfo_t = undefined;
while (true) {
const thread = try maybe_sync.cancel_region.awaitIoUring();
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 |
@as(i32, if (child.request_resource_usage_statistics) linux.W.NOWAIT else 0),
.addr3 = 0,
.resv = 0,
};
ev.yield(null, .nothing);
switch (maybe_sync.cancel_region.errno()) {
.SUCCESS => {
if (child.request_resource_usage_statistics) {
const sync = try maybe_sync.enterSync(ev);
while (true) {
try sync.cancel_region.await(.nothing);
var rusage: linux.rusage = undefined;
switch (linux.errno(linux.waitid(
.PID,
pid,
&info,
linux.W.EXITED | linux.W.NOHANG,
&rusage,
))) {
.SUCCESS => {
child.resource_usage_statistics.rusage = rusage;
break;
},
.INTR, .CANCELED => {},
.CHILD => |err| return errnoBug(err),
else => |err| return unexpectedErrno(err),
}
}
}
const status: u32 = @bitCast(info.fields.common.second.sigchld.status);
const code: linux.CLD = @fromBackingInt(@intCast(info.code));
return switch (code) {
.EXITED => .{ .exited = @truncate(status) },
.KILLED, .DUMPED => .{ .signal = @fromBackingInt(@intCast(status)) },
.TRAPPED, .STOPPED => .{ .stopped = @fromBackingInt(@intCast(status)) },
_, .CONTINUED => .{ .unknown = status },
};
},
.INTR, .CANCELED => {},
.CHILD => |err| return errnoBug(err),
else => |err| return unexpectedErrno(err),
}
}
}