mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-16 08:46:08 +03:00
command: only spin on waitpid if it's non-blocking
This commit is contained in:

committed by
Mitchell Hashimoto

parent
aa9e12dac2
commit
2e54ad2cce
@ -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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user