mirror of
https://github.com/robbert-vdh/yabridge.git
synced 2026-05-10 04:30:12 +02:00
Move watchdog timer disable check to common/utils
We may also want to check this from the plugin.
This commit is contained in:
@@ -23,6 +23,15 @@
|
|||||||
namespace bp = boost::process;
|
namespace bp = boost::process;
|
||||||
namespace fs = boost::filesystem;
|
namespace fs = boost::filesystem;
|
||||||
|
|
||||||
|
using namespace std::literals::string_literals;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If this environment variable is set to `1`, then we won't enable the watchdog
|
||||||
|
* timer. This is only necessary when running the Wine process under a different
|
||||||
|
* namespace than the host.
|
||||||
|
*/
|
||||||
|
constexpr char disable_watchdog_timer_env_var[] = "YABRIDGE_NO_WATCHDOG";
|
||||||
|
|
||||||
fs::path get_temporary_directory() {
|
fs::path get_temporary_directory() {
|
||||||
bp::environment env = boost::this_process::environment();
|
bp::environment env = boost::this_process::environment();
|
||||||
if (!env["XDG_RUNTIME_DIR"].empty()) {
|
if (!env["XDG_RUNTIME_DIR"].empty()) {
|
||||||
@@ -57,6 +66,13 @@ std::optional<rlim_t> get_rttime_limit() noexcept {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool is_watchdog_timer_disabled() {
|
||||||
|
// This is safe because we're not storing the pointer anywhere and the
|
||||||
|
// environment doesn't get modified anywhere
|
||||||
|
// NOLINTNEXTLINE(concurrency-mt-unsafe)
|
||||||
|
return getenv(disable_watchdog_timer_env_var) == "1"s;
|
||||||
|
}
|
||||||
|
|
||||||
bool pid_running(pid_t pid) {
|
bool pid_running(pid_t pid) {
|
||||||
// With regular individually hosted plugins we can simply check whether the
|
// With regular individually hosted plugins we can simply check whether the
|
||||||
// process is still running, however Boost.Process does not allow you to do
|
// process is still running, however Boost.Process does not allow you to do
|
||||||
|
|||||||
@@ -117,6 +117,16 @@ bool set_realtime_priority(bool sched_fifo, int priority = 5) noexcept;
|
|||||||
*/
|
*/
|
||||||
std::optional<rlim_t> get_rttime_limit() noexcept;
|
std::optional<rlim_t> get_rttime_limit() noexcept;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns `true` if `YABRIDGE_NO_WATCHDOG` is set to `1`. In that case we will
|
||||||
|
* not check if the Wine plugin host process successfully started, and we'll
|
||||||
|
* also don't check if the native plugin host is still alive. Disabling the
|
||||||
|
* watchdog timers can cause plugins hang during scanning and dangling Wine
|
||||||
|
* processes to be left running, so this should only ever be used when running
|
||||||
|
* the Wine plugin host under a separate namespace.
|
||||||
|
*/
|
||||||
|
bool is_watchdog_timer_disabled();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check whether a process with the given PID is still active (and not a
|
* Check whether a process with the given PID is still active (and not a
|
||||||
* zombie).
|
* zombie).
|
||||||
|
|||||||
+1
-14
@@ -18,21 +18,10 @@
|
|||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#include <boost/process/environment.hpp>
|
|
||||||
|
|
||||||
#include "bridges/common.h"
|
#include "bridges/common.h"
|
||||||
|
|
||||||
namespace bp = boost::process;
|
|
||||||
|
|
||||||
using namespace std::literals::chrono_literals;
|
using namespace std::literals::chrono_literals;
|
||||||
|
|
||||||
/**
|
|
||||||
* If this environment variable is set to `1`, then we won't enable the watchdog
|
|
||||||
* timer. This is only necessary when running the Wine process under a different
|
|
||||||
* namespace than the host.
|
|
||||||
*/
|
|
||||||
constexpr char disable_watchdog_timer_env_var[] = "YABRIDGE_NO_WATCHDOG";
|
|
||||||
|
|
||||||
uint32_t WINAPI
|
uint32_t WINAPI
|
||||||
win32_thread_trampoline(fu2::unique_function<void()>* entry_point) {
|
win32_thread_trampoline(fu2::unique_function<void()>* entry_point) {
|
||||||
(*entry_point)();
|
(*entry_point)();
|
||||||
@@ -94,12 +83,10 @@ MainContext::MainContext()
|
|||||||
events_timer(context),
|
events_timer(context),
|
||||||
watchdog_context(),
|
watchdog_context(),
|
||||||
watchdog_timer(watchdog_context) {
|
watchdog_timer(watchdog_context) {
|
||||||
bp::environment env = boost::this_process::environment();
|
|
||||||
|
|
||||||
// NOTE: We allow disabling the watchdog timer to allow the Wine process to
|
// NOTE: We allow disabling the watchdog timer to allow the Wine process to
|
||||||
// be run from a separate namespace. This is not something you'd
|
// be run from a separate namespace. This is not something you'd
|
||||||
// normally want to enable.
|
// normally want to enable.
|
||||||
if (env[disable_watchdog_timer_env_var].to_string() == "1") {
|
if (is_watchdog_timer_disabled()) {
|
||||||
std::cerr << "WARNING: Watchdog timer disabled. Not protecting"
|
std::cerr << "WARNING: Watchdog timer disabled. Not protecting"
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
std::cerr << " against dangling processes." << std::endl;
|
std::cerr << " against dangling processes." << std::endl;
|
||||||
|
|||||||
Reference in New Issue
Block a user