diff --git a/CHANGELOG.md b/CHANGELOG.md index c1946804..4c244780 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,12 @@ Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Added + +- Added an environment variable to disable the watchdog timer. This allows the + Wine process to run under a separate namespace. If you don't know that you + need this, then you probably don't need this! + ### Changed - The audio processing implementation for both VST2 and VST3 plugins has been diff --git a/README.md b/README.md index 68728363..1cfb59cf 100644 --- a/README.md +++ b/README.md @@ -654,6 +654,11 @@ the yabridge [Discord](https://discord.gg/pyNeweqadf). [plugin groups](#plugin-groups) to run multiple instances of your most frequently used plugins within a single process. +- If you're using a `WINELOADER` that runs the Wine process under a separate + namespace while the host is not sandboxed, then you'll have to use the + `YABRIDGE_NO_WATCHDOG` environment variable to disable the watchdog timer. If + you know what this means then you probably know what you're doing. + ## Performance tuning Running Windows plugins under Wine should have a minimal performance overhead, diff --git a/src/wine-host/utils.cpp b/src/wine-host/utils.cpp index dc6dd5b8..c2958eb8 100644 --- a/src/wine-host/utils.cpp +++ b/src/wine-host/utils.cpp @@ -16,10 +16,23 @@ #include "utils.h" +#include + +#include + #include "bridges/common.h" +namespace bp = boost::process; + 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 win32_thread_trampoline(fu2::unique_function* entry_point) { (*entry_point)(); @@ -81,9 +94,21 @@ MainContext::MainContext() events_timer(context), 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 + // be run from a separate namespace. This is not something you'd + // normally want to enable. + if (env[disable_watchdog_timer_env_var].to_string() == "1") { + std::cerr << "WARNING: Watchdog timer disabled. Not protecting" + << std::endl; + std::cerr << " against dangling processes." << std::endl; + return; + } + // To account for hosts terminating before the bridged plugin has - // initialized, we'll do the first watchdog check five seconds. After this - // we'll run the timer on a 30 second interval. + // initialized, we'll do the first watchdog check five seconds. After + // this we'll run the timer on a 30 second interval. async_handle_watchdog_timer(5s); watchdog_handler = Win32Thread([&]() {