Zig 0.17.0-dev (Split by item) This is an example of documentation generated by
ZigDoc , an alternative to Zig's built-in
Auto Doc feature. See also
examples in other modes/formats . The project being documented here (as the example) is the Zig standard library.
std › Io › Threaded › childWaitPosix Private Function childWaitPosix Doc Source Private Function std.Io.Threaded.childWaitPosix
fn childWaitPosix (child : *process .Child ) process .Child .WaitError !process .Child .Term Params File Io/Threaded.zig: 15533
15533
15534
15535
15536
15537
15538
15539
15540
15541
15542
15543
15544
15545
15546
15547
15548
15549
15550
15551
15552
15553
15554
15555
15556
15557
15558
15559
15560
15561
15562
15563
15564
15565
15566
15567
15568
15569
15570
15571
15572
15573
15574
15575
15576
15577
15578
15579
15580
15581
15582
15583
15584
15585
15586
15587
15588
15589
15590
15591
15592
15593
15594
15595
15596
15597
15598
15599 fn childWaitPosix (child : *process .Child ) process .Child .WaitError !process .Child .Term {
defer childCleanupPosix (child );
const pid = child .id .?;
var ru : posix .rusage = undefined ;
const ru_ptr = if (child .request_resource_usage_statistics ) &ru else null ;
if (have_wait4 ) {
var status : if (builtin .link_libc ) c_int else i32 = undefined ;
const syscall : Syscall = try .start ();
while (true ) switch (posix .errno (posix .system .wait4 (pid , &status , 0 , ru_ptr ))) {
.SUCCESS => {
syscall .finish ();
if (ru_ptr ) |p | child .resource_usage_statistics .rusage = p .*;
return statusToTerm (@bitCast (status ));
},
.INTR => {
try syscall .checkCancel ();
continue ;
},
.CHILD => |err | return syscall .errnoBug (err ), // Double-free.
else => |err | return syscall .unexpectedErrno (err ),
};
}
if (have_waitid ) {
const linux = std .os .linux ; // Bypass libc which has the wrong signature.
var info : linux .siginfo_t = undefined ;
const syscall : Syscall = try .start ();
while (true ) switch (linux .errno (linux .waitid (.PID , pid , &info , linux .W .EXITED , ru_ptr ))) {
.SUCCESS => {
syscall .finish ();
if (ru_ptr ) |p | child .resource_usage_statistics .rusage = p .*;
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 => {
try syscall .checkCancel ();
continue ;
},
.CHILD => |err | return syscall .errnoBug (err ), // Double-free.
else => |err | return syscall .unexpectedErrno (err ),
};
}
var status : if (builtin .link_libc ) c_int else i32 = undefined ;
const syscall : Syscall = try .start ();
while (true ) switch (posix .errno (posix .system .waitpid (pid , &status , 0 ))) {
.SUCCESS => {
syscall .finish ();
return statusToTerm (@bitCast (status ));
},
.INTR => {
try syscall .checkCancel ();
continue ;
},
.CHILD => |err | return syscall .errnoBug (err ), // Double-free.
else => |err | return syscall .unexpectedErrno (err ),
};
}