summaryrefslogtreecommitdiff
path: root/src/Command.zig
diff options
context:
space:
mode:
authorWill Pragnell <wpragnell@gmail.com>2023-08-30 22:02:25 -0700
committerMitchell Hashimoto <mitchell.hashimoto@gmail.com>2023-08-31 07:51:50 -0700
commit2e54ad2ccefc2cd1b8832aad40e8d93884392372 (patch)
tree17e40ef62603be1db4a9fabc526f90af09c007aa /src/Command.zig
parentaa9e12dac2d11fc71f055bd5db61f18453fb5345 (diff)
command: only spin on waitpid if it's non-blocking
Diffstat (limited to 'src/Command.zig')
-rw-r--r--src/Command.zig25
1 files changed, 14 insertions, 11 deletions
diff --git a/src/Command.zig b/src/Command.zig
index 12dea7f3a..8fa8808a5 100644
--- a/src/Command.zig
+++ b/src/Command.zig
@@ -187,17 +187,20 @@ fn setupFd(src: File.Handle, target: i32) !void {
/// Wait for the command to exit and return information about how it exited.
pub fn wait(self: Command, block: bool) !Exit {
- // We specify NOHANG because its not our fault if the process we launch
- // for the tty doesn't properly waitpid its children. We don't want
- // to hang the terminal over it.
- // When NOHANG is specified, waitpid will return a pid of 0 if the process
- // doesn't have a status to report. When that happens, it is as though the
- // wait call has not been performed, so we need to keep trying until we get
- // a non-zero pid back, otherwise we end up with zombie processes.
- var res = std.os.WaitPidResult{ .pid = 0, .status = 0 };
- while (res.pid == 0) {
- res = std.os.waitpid(self.pid.?, if (block) 0 else std.c.W.NOHANG);
- }
+ const res = if (block) std.os.waitpid(self.pid.?, 0) else res: {
+ // We specify NOHANG because its not our fault if the process we launch
+ // for the tty doesn't properly waitpid its children. We don't want
+ // to hang the terminal over it.
+ // When NOHANG is specified, waitpid will return a pid of 0 if the process
+ // doesn't have a status to report. When that happens, it is as though the
+ // wait call has not been performed, so we need to keep trying until we get
+ // a non-zero pid back, otherwise we end up with zombie processes.
+ while (true) {
+ const res = std.os.waitpid(self.pid.?, std.c.W.NOHANG);
+ if (res.pid != 0) break :res res;
+ }
+ };
+
return Exit.init(res.status);
}