authorgravatar for ben@magicmoremagic.comBen Crist <ben@magicmoremagic.com> 2022-11-20 12:20:14-06:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-10-17 16:56:15-07:00
log6d47198303847409a900f57bbe84195b32375093
tree58cf515c3cea23b281cee0e7d41b61f7fdbbafa2
parent7a9500fd80990a3dc47821e627162bf769eecbba

return error.AlreadyTerminated from std.ChildProcess.kill when necessary


3 files changed, 12 insertions(+), 5 deletions(-)

lib/std/child_process.zig+8-2
......@@ -221,7 +221,10 @@ pub const ChildProcess = struct {
221221 return term;
222222 }
223223
224 try windows.TerminateProcess(self.id, exit_code);
224 windows.TerminateProcess(self.id, exit_code) catch |err| switch (err) {
225 error.PermissionDenied => return error.AlreadyTerminated,
226 else => return err,
227 };
225228 try self.waitUnwrappedWindows();
226229 return self.term.?;
227230 }
......@@ -231,7 +234,10 @@ pub const ChildProcess = struct {
231234 self.cleanupStreams();
232235 return term;
233236 }
234 try os.kill(self.id, os.SIG.TERM);
237 os.kill(self.id, os.SIG.TERM) catch |err| switch (err) {
238 error.ProcessNotFound => return error.AlreadyTerminated,
239 else => return err,
240 };
235241 try self.waitUnwrapped();
236242 return self.term.?;
237243 }
lib/std/os.zig+2-2
......@@ -639,14 +639,14 @@ pub fn raise(sig: u8) RaiseError!void {
639639 @compileError("std.os.raise unimplemented for this target");
640640}
641641
642pub const KillError = error{PermissionDenied} || UnexpectedError;
642pub const KillError = error{ ProcessNotFound, PermissionDenied } || UnexpectedError;
643643
644644pub fn kill(pid: pid_t, sig: u8) KillError!void {
645645 switch (errno(system.kill(pid, sig))) {
646646 .SUCCESS => return,
647647 .INVAL => unreachable, // invalid signal
648648 .PERM => return error.PermissionDenied,
649 .SRCH => unreachable, // always a race condition
649 .SRCH => return error.ProcessNotFound,
650650 else => |err| return unexpectedErrno(err),
651651 }
652652}
lib/std/os/windows.zig+2-1
......@@ -1593,11 +1593,12 @@ pub fn GetModuleFileNameW(hModule: ?HMODULE, buf_ptr: [*]u16, buf_len: DWORD) Ge
15931593 return buf_ptr[0..rc :0];
15941594}
15951595
1596pub const TerminateProcessError = error{Unexpected};
1596pub const TerminateProcessError = error{ PermissionDenied, Unexpected };
15971597
15981598pub fn TerminateProcess(hProcess: HANDLE, uExitCode: UINT) TerminateProcessError!void {
15991599 if (kernel32.TerminateProcess(hProcess, uExitCode) == 0) {
16001600 switch (kernel32.GetLastError()) {
1601 Win32Error.ACCESS_DENIED => return error.PermissionDenied,
16011602 else => |err| return unexpectedError(err),
16021603 }
16031604 }