From 6d47198303847409a900f57bbe84195b32375093 Mon Sep 17 00:00:00 2001 From: Ben Crist Date: Sun, 20 Nov 2022 12:20:14 -0600 Subject: [PATCH] return error.AlreadyTerminated from std.ChildProcess.kill when necessary --- lib/std/child_process.zig | 10 ++++++++-- lib/std/os.zig | 4 ++-- lib/std/os/windows.zig | 3 ++- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/lib/std/child_process.zig b/lib/std/child_process.zig index 6a5fabc41f4d937ff5611e231d43dc31577ce7ce..645cb841e41662c9a33fd499a25fea033c118447 100644 --- a/lib/std/child_process.zig +++ b/lib/std/child_process.zig @@ -221,7 +221,10 @@ pub const ChildProcess = struct { return term; } - try windows.TerminateProcess(self.id, exit_code); + windows.TerminateProcess(self.id, exit_code) catch |err| switch (err) { + error.PermissionDenied => return error.AlreadyTerminated, + else => return err, + }; try self.waitUnwrappedWindows(); return self.term.?; } @@ -231,7 +234,10 @@ pub const ChildProcess = struct { self.cleanupStreams(); return term; } - try os.kill(self.id, os.SIG.TERM); + os.kill(self.id, os.SIG.TERM) catch |err| switch (err) { + error.ProcessNotFound => return error.AlreadyTerminated, + else => return err, + }; try self.waitUnwrapped(); return self.term.?; } diff --git a/lib/std/os.zig b/lib/std/os.zig index d6d4f596a15d7a98e70f00e7bdd4e95bec03f4de..90e738d775772c0bd25ca92b2bb9b1318e117c85 100644 --- a/lib/std/os.zig +++ b/lib/std/os.zig @@ -639,14 +639,14 @@ pub fn raise(sig: u8) RaiseError!void { @compileError("std.os.raise unimplemented for this target"); } -pub const KillError = error{PermissionDenied} || UnexpectedError; +pub const KillError = error{ ProcessNotFound, PermissionDenied } || UnexpectedError; pub fn kill(pid: pid_t, sig: u8) KillError!void { switch (errno(system.kill(pid, sig))) { .SUCCESS => return, .INVAL => unreachable, // invalid signal .PERM => return error.PermissionDenied, - .SRCH => unreachable, // always a race condition + .SRCH => return error.ProcessNotFound, else => |err| return unexpectedErrno(err), } } diff --git a/lib/std/os/windows.zig b/lib/std/os/windows.zig index d38a63ef39f78a6d7d83c7a0648d0e3e3c6f6c65..05b754de8d33603e4a15df16ab12294195f6dd3d 100644 --- a/lib/std/os/windows.zig +++ b/lib/std/os/windows.zig @@ -1593,11 +1593,12 @@ pub fn GetModuleFileNameW(hModule: ?HMODULE, buf_ptr: [*]u16, buf_len: DWORD) Ge return buf_ptr[0..rc :0]; } -pub const TerminateProcessError = error{Unexpected}; +pub const TerminateProcessError = error{ PermissionDenied, Unexpected }; pub fn TerminateProcess(hProcess: HANDLE, uExitCode: UINT) TerminateProcessError!void { if (kernel32.TerminateProcess(hProcess, uExitCode) == 0) { switch (kernel32.GetLastError()) { + Win32Error.ACCESS_DENIED => return error.PermissionDenied, else => |err| return unexpectedError(err), } } -- 2.54.0