From 60e4619ef1fa677489a9404097fbcb17ebce10aa Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Mon, 11 Apr 2022 13:20:51 +0200 Subject: [PATCH] Move pid_running() to process.h --- src/common/process.cpp | 23 +++++++++++++++++++++++ src/common/process.h | 6 ++++++ src/common/utils.cpp | 19 ------------------- src/common/utils.h | 6 ------ src/wine-host/bridges/common.cpp | 1 + 5 files changed, 30 insertions(+), 25 deletions(-) diff --git a/src/common/process.cpp b/src/common/process.cpp index 4732edc7..a9827ecc 100644 --- a/src/common/process.cpp +++ b/src/common/process.cpp @@ -18,6 +18,29 @@ #include +#include + +namespace fs = ghc::filesystem; + +bool pid_running(pid_t pid) { + // With regular individually hosted plugins we can simply check whether the + // process is still running, however Boost.Process does not allow you to do + // the same thing for a process that's not a direct child if this process. + // When using plugin groups we'll have to manually check whether the PID + // returned by the group host process is still active. We sadly can't use + // `kill()` for this as that provides no way to distinguish between active + // processes and zombies, and a terminated group host process will always be + // left as a zombie process. If the process is active, then + // `/proc//{cwd,exe,root}` will be valid symlinks. + std::error_code err; + fs::canonical("/proc/" + std::to_string(pid) + "/exe", err); + + // NOTE: We can get a `EACCES` here if we don't have permissions to read + // this process's memory. This does mean that the process is still + // running. + return !err || err.value() == EACCES; +} + ProcessEnvironment::ProcessEnvironment(char** initial_env) { // We'll need to read all strings from `initial_env`. They _should_ all be // zero-terminated strings, with a null pointer to indicate the end of the diff --git a/src/common/process.h b/src/common/process.h index 55e4f2bb..094a947b 100644 --- a/src/common/process.h +++ b/src/common/process.h @@ -25,6 +25,12 @@ // pulling in Boost.Process' Boost.Filesystem dependency (which would defeat the // entire purpose). +/** + * Check whether a process with the given PID is still active (and not a + * zombie). + */ +bool pid_running(pid_t pid); + /** * Helper to create an `environ`-like environment object for passing to the * `exec*e()` family of functions. diff --git a/src/common/utils.cpp b/src/common/utils.cpp index 975773b1..55e2d6d9 100644 --- a/src/common/utils.cpp +++ b/src/common/utils.cpp @@ -94,25 +94,6 @@ bool is_watchdog_timer_disabled() { return disable_watchdog_env && disable_watchdog_env == "1"sv; } -bool pid_running(pid_t pid) { - // With regular individually hosted plugins we can simply check whether the - // process is still running, however Boost.Process does not allow you to do - // the same thing for a process that's not a direct child if this process. - // When using plugin groups we'll have to manually check whether the PID - // returned by the group host process is still active. We sadly can't use - // `kill()` for this as that provides no way to distinguish between active - // processes and zombies, and a terminated group host process will always be - // left as a zombie process. If the process is active, then - // `/proc//{cwd,exe,root}` will be valid symlinks. - std::error_code err; - fs::canonical("/proc/" + std::to_string(pid) + "/exe", err); - - // NOTE: We can get a `EACCES` here if we don't have permissions to read - // this process's memory. This does mean that the process is still - // running. - return !err || err.value() == EACCES; -} - std::string url_encode_path(std::string path) { // We only need to escape a couple of special characters here. This is used // in the notifications as well as in the XDND proxy. We encode the reserved diff --git a/src/common/utils.h b/src/common/utils.h index db8530fd..584d03a5 100644 --- a/src/common/utils.h +++ b/src/common/utils.h @@ -138,12 +138,6 @@ std::optional get_rttime_limit() noexcept; */ bool is_watchdog_timer_disabled(); -/** - * Check whether a process with the given PID is still active (and not a - * zombie). - */ -bool pid_running(pid_t pid); - /** * URL encode a file path. We won't escape forward slashes, and `path` should * not yet include the `file://` prefix. diff --git a/src/wine-host/bridges/common.cpp b/src/wine-host/bridges/common.cpp index 7a183274..83225ff0 100644 --- a/src/wine-host/bridges/common.cpp +++ b/src/wine-host/bridges/common.cpp @@ -18,6 +18,7 @@ #include +#include "../../common/process.h" #include "../editor.h" /**