From 0c047f9a66a713bc6d9c860343f833233bb8778c Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Tue, 26 May 2020 17:09:09 +0200 Subject: [PATCH] Work around a memory corruption issue on unload I'm really not sure what is happening here, and it might just be a winelib thing. --- src/wine-host/bridges/vst2.cpp | 10 ++++++---- src/wine-host/bridges/vst2.h | 15 ++++++++++++--- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/wine-host/bridges/vst2.cpp b/src/wine-host/bridges/vst2.cpp index b80688f3..a52683de 100644 --- a/src/wine-host/bridges/vst2.cpp +++ b/src/wine-host/bridges/vst2.cpp @@ -67,7 +67,10 @@ Vst2Bridge& get_bridge_instance(const AEffect* plugin) { Vst2Bridge::Vst2Bridge(std::string plugin_dll_path, std::string socket_endpoint_path) - : plugin_handle(LoadLibrary(plugin_dll_path.c_str()), FreeLibrary), + // See `plugin_handle`s docstring for information on why we're leaking + // memory here + // : plugin_handle(LoadLibrary(plugin_dll_path.c_str()), FreeLibrary), + : plugin_handle(LoadLibrary(plugin_dll_path.c_str())), io_context(), socket_endpoint(socket_endpoint_path), host_vst_dispatch(io_context), @@ -85,9 +88,8 @@ Vst2Bridge::Vst2Bridge(std::string plugin_dll_path, // there are some older deprecated names that legacy plugins may still use VstEntryPoint vst_entry_point = nullptr; for (auto name : {"VSTPluginMain", "main_plugin", "main"}) { - vst_entry_point = - reinterpret_cast(reinterpret_cast( - GetProcAddress(plugin_handle.get(), name))); + vst_entry_point = reinterpret_cast( + reinterpret_cast(GetProcAddress(plugin_handle, name))); if (vst_entry_point != nullptr) { break; diff --git a/src/wine-host/bridges/vst2.h b/src/wine-host/bridges/vst2.h index 5abfd252..0622c891 100644 --- a/src/wine-host/bridges/vst2.h +++ b/src/wine-host/bridges/vst2.h @@ -165,10 +165,19 @@ class Vst2Bridge { /** * The shared library handle of the VST plugin. I sadly could not get - * Boost.DLL to work here, so we'll just load the VST plugisn by hand. + * Boost.DLL to work here, so we'll just load the VST plugins by hand. + * + * FIXME: I don't know why, but `FreeLibrary()` seems to corrupt memory. + * This leads to a lot of weird behavior, such as plugins crashing as + * soon as other plugins get loaded or calls to `LoadLibrary()` + * returning null pointers while they would otherwise load fine + * without the prior call to `FreeLibrary`. We are leaking memory + * here until this is fixed, but it should not be a huge issue since + * this leak only exists for plugin groups. */ - std::unique_ptr, decltype(&FreeLibrary)> - plugin_handle; + // std::unique_ptr, decltype(&FreeLibrary)> + // plugin_handle; + HMODULE plugin_handle; /** * The loaded plugin's `AEffect` struct, obtained using the above library