From ffe46e225c012785336dfc794acf99b212108c58 Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Sun, 24 Jan 2021 17:02:56 +0100 Subject: [PATCH] Relay Wine STDIO with SCHED_OTHER I haven't seen this cause issues myself, but it would not surprise me if a plugin that produces a constant stream of FIXMEs would steal resources from audio processing if the threads that are relaying those messages are set to SCHED_FIFO. --- CHANGELOG.md | 3 +++ src/plugin/bridges/common.h | 6 ++++++ src/wine-host/bridges/group.cpp | 8 +++++++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 44375dc9..20b7026f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -78,6 +78,9 @@ TODO: Add an updated screenshot with some fancy VST3-only plugins to the readme to realtime priority. This prevents changing the scheduling policy of your host's GUI thread if your host instantiates plugins from its GUI thread like REAPER does. + - Relaying messages printed by the plugin and Wine is now done without + realtime priority, as this could in theory cause issues with plugins that + produce a lot of fixmes. - The realtime scheduling priorities of all audio threads on the Wine plugin host are now periodically synchronized with those of the host's audio threads. diff --git a/src/plugin/bridges/common.h b/src/plugin/bridges/common.h index ae4f66e8..b0fa8706 100644 --- a/src/plugin/bridges/common.h +++ b/src/plugin/bridges/common.h @@ -91,8 +91,14 @@ class PluginBridge { sockets.base_dir.string()}))), has_realtime_priority(has_realtime_priority_promise.get_future()), wine_io_handler([&]() { + // We no longer run this thread with realtime scheduling because + // plugins that produce a lot of FIXMEs could in theory cause + // dropouts that way, but we still need to run this from a thread + // to check whether we support it has_realtime_priority_promise.set_value( set_realtime_priority(true)); + set_realtime_priority(false); + io_context.run(); }) {} diff --git a/src/wine-host/bridges/group.cpp b/src/wine-host/bridges/group.cpp index 9cba85a7..cdd1ca4b 100644 --- a/src/wine-host/bridges/group.cpp +++ b/src/wine-host/bridges/group.cpp @@ -104,7 +104,13 @@ GroupBridge::GroupBridge(boost::filesystem::path group_socket_path) async_log_pipe_lines(stdout_redirect.pipe, stdout_buffer, "[STDOUT] "); async_log_pipe_lines(stderr_redirect.pipe, stderr_buffer, "[STDERR] "); - stdio_handler = Win32Thread([&]() { stdio_context.run(); }); + stdio_handler = Win32Thread([&]() { + // In case a plugin generates a lot of FIXMEs relaying this IO with + // realtime scheduling could in theory cause latency issues + set_realtime_priority(false); + + stdio_context.run(); + }); } GroupBridge::~GroupBridge() {