Ildaeil: Add mutex around plugin load to prevent race conditions

This commit is contained in:
falkTX 2021-11-15 18:10:44 +00:00
parent f0750f235e
commit acc99bef1c

View file

@ -241,6 +241,7 @@ struct IldaeilModule : Module {
mutable NativeTimeInfo fCarlaTimeInfo; mutable NativeTimeInfo fCarlaTimeInfo;
void* fUI = nullptr; void* fUI = nullptr;
Mutex fPluginLoadMutex;
float audioDataIn1[BUFFER_SIZE]; float audioDataIn1[BUFFER_SIZE];
float audioDataIn2[BUFFER_SIZE]; float audioDataIn2[BUFFER_SIZE];
@ -414,6 +415,7 @@ struct IldaeilModule : Module {
CarlaEngine* const engine = carla_get_engine_from_handle(fCarlaHostHandle); CarlaEngine* const engine = carla_get_engine_from_handle(fCarlaHostHandle);
water::XmlDocument xml(projectState); water::XmlDocument xml(projectState);
const MutexLocker cml(fPluginLoadMutex);
engine->loadProjectInternal(xml, true); engine->loadProjectInternal(xml, true);
} }
@ -635,10 +637,12 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback, Thread {
bool idleCallbackActive = false; bool idleCallbackActive = false;
IldaeilModule* const module; IldaeilModule* const module;
Mutex& fPluginLoadMutex;
IldaeilWidget(IldaeilModule* const m) IldaeilWidget(IldaeilModule* const m)
: ImGuiWidget(), : ImGuiWidget(),
module(m) module(m),
fPluginLoadMutex(m->fPluginLoadMutex)
{ {
if (module->fCarlaHostHandle == nullptr) if (module->fCarlaHostHandle == nullptr)
{ {
@ -828,6 +832,8 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback, Thread {
carla_set_engine_option(handle, ENGINE_OPTION_PREFER_PLUGIN_BRIDGES, fPluginWillRunInBridgeMode, nullptr); carla_set_engine_option(handle, ENGINE_OPTION_PREFER_PLUGIN_BRIDGES, fPluginWillRunInBridgeMode, nullptr);
const MutexLocker cml(fPluginLoadMutex);
if (carla_add_plugin(handle, BINARY_NATIVE, fPluginType, nullptr, nullptr, if (carla_add_plugin(handle, BINARY_NATIVE, fPluginType, nullptr, nullptr,
label, 0, 0x0, PLUGIN_OPTIONS_NULL)) label, 0, 0x0, PLUGIN_OPTIONS_NULL))
{ {
@ -1008,6 +1014,8 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback, Thread {
if (path != nullptr) if (path != nullptr)
carla_set_engine_option(module->fCarlaHostHandle, ENGINE_OPTION_PLUGIN_PATH, pluginType, path); carla_set_engine_option(module->fCarlaHostHandle, ENGINE_OPTION_PLUGIN_PATH, pluginType, path);
const MutexLocker cml(fPluginLoadMutex);
if (const uint count = carla_get_cached_plugin_count(pluginType, path)) if (const uint count = carla_get_cached_plugin_count(pluginType, path))
{ {
fPluginCount = 0; fPluginCount = 0;