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.
This commit is contained in:
Robbert van der Helm
2021-01-24 17:02:56 +01:00
parent 19fd99b58e
commit ffe46e225c
3 changed files with 16 additions and 1 deletions
+3
View File
@@ -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.
+6
View File
@@ -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();
}) {}
+7 -1
View File
@@ -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() {