diff --git a/src/wine-host/bridges/group.cpp b/src/wine-host/bridges/group.cpp index 8a42c56d..7cc08034 100644 --- a/src/wine-host/bridges/group.cpp +++ b/src/wine-host/bridges/group.cpp @@ -98,7 +98,7 @@ 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 = std::jthread([&]() { stdio_context.run(); }); + stdio_handler = Win32Thread([&]() { stdio_context.run(); }); } GroupBridge::~GroupBridge() { @@ -128,7 +128,8 @@ void GroupBridge::handle_plugin_dispatch(size_t plugin_id) { boost::asio::post(plugin_context.context, [this, plugin_id]() { std::lock_guard lock(active_plugins_mutex); - // The join is implicit because we're using std::jthread + // The join is implicit because we're using Win32Thread (which mimics + // std::jthread) active_plugins.erase(plugin_id); }); @@ -219,7 +220,7 @@ void GroupBridge::accept_requests() { // is only used within this context we don't need any locks. const size_t plugin_id = next_plugin_id.fetch_add(1); active_plugins[plugin_id] = - std::pair(std::jthread([this, plugin_id]() { + std::pair(Win32Thread([this, plugin_id]() { handle_plugin_dispatch(plugin_id); }), std::move(bridge)); diff --git a/src/wine-host/bridges/group.h b/src/wine-host/bridges/group.h index 52b43138..5c2a8d90 100644 --- a/src/wine-host/bridges/group.h +++ b/src/wine-host/bridges/group.h @@ -244,7 +244,7 @@ class GroupBridge { /** * A thread that runs the `stdio_context` loop. */ - std::jthread stdio_handler; + Win32Thread stdio_handler; boost::asio::local::stream_protocol::endpoint group_socket_endpoint; /** @@ -263,7 +263,7 @@ class GroupBridge { * on `next_plugin_id`. */ std::unordered_map>> + std::pair>> active_plugins; /** * A counter for the next unique plugin ID. When hosting a new plugin we'll diff --git a/src/wine-host/individual-host.cpp b/src/wine-host/individual-host.cpp index 087372f0..e7782b3f 100644 --- a/src/wine-host/individual-host.cpp +++ b/src/wine-host/individual-host.cpp @@ -60,13 +60,12 @@ int __cdecl main(int argc, char* argv[]) { << std::endl; // As explained in `Vst2Bridge`, the plugin has to be initialized in the - // same thread as the one that calls `io_context.run()`. And for some - // reason, a lot of plugins have memory corruption issues when executing - // `LoadLibrary()` or some of their functions from within a `std::thread` - // (although the WinAPI `CreateThread()` does not have these issues). This - // setup is slightly more convoluted than it has to be, but doing it this - // way we don't need to differentiate between individually hosted plugins - // and plugin groups when it comes to event handling. + // same thread as the one that calls `io_context.run()`. This setup is + // slightly more convoluted than it has to be, but doing it this way we + // don't need to differentiate between individually hosted plugins and + // plugin groups when it comes to event handling. + // TODO: Update documentation once we figure out if we can safely replace + // PluginContext again with a normal `io_context`. PluginContext plugin_context{}; std::unique_ptr bridge; try { @@ -84,7 +83,7 @@ int __cdecl main(int argc, char* argv[]) { // We'll listen for `dispatcher()` calls on a different thread, but the // actual events will still be executed within the IO context - std::jthread dispatch_handler([&]() { bridge->handle_dispatch(); }); + Win32Thread dispatch_handler([&]() { bridge->handle_dispatch(); }); // Handle Win32 messages and X11 events on a timer, just like in // `GroupBridge::async_handle_events()``