summaryrefslogtreecommitdiff
path: root/src/plugins/PluginSystem.cpp
diff options
context:
space:
mode:
authorVaxry <vaxry@vaxry.net>2024-04-22 15:46:43 +0100
committerVaxry <vaxry@vaxry.net>2024-04-22 15:46:43 +0100
commit450343b7b83ba659f6a932092aff922cc1cddd2b (patch)
treecc888b2c47b02310cd6c629e08be44507e64abcf /src/plugins/PluginSystem.cpp
parente1644e91ead7cdef5d08bfe6a579c4478a816a8e (diff)
pluginsystem: unload entire plugin before calling dlclose()
fixes #5689
Diffstat (limited to 'src/plugins/PluginSystem.cpp')
-rw-r--r--src/plugins/PluginSystem.cpp11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/plugins/PluginSystem.cpp b/src/plugins/PluginSystem.cpp
index 44b4de1f..ae87aedb 100644
--- a/src/plugins/PluginSystem.cpp
+++ b/src/plugins/PluginSystem.cpp
@@ -119,11 +119,16 @@ void CPluginSystem::unloadPlugin(const CPlugin* plugin, bool eject) {
g_pConfigManager->removePluginConfig(plugin->m_pHandle);
- dlclose(plugin->m_pHandle);
+ // save these two for dlclose and a log,
+ // as erase_if will kill the pointer
+ const auto PLNAME = plugin->name;
+ const auto PLHANDLE = plugin->m_pHandle;
- Debug::log(LOG, " [PluginSystem] Plugin {} unloaded.", plugin->name);
+ std::erase_if(m_vLoadedPlugins, [&](const auto& other) { return other->m_pHandle == PLHANDLE; });
- std::erase_if(m_vLoadedPlugins, [&](const auto& other) { return other->m_pHandle == plugin->m_pHandle; });
+ dlclose(PLHANDLE);
+
+ Debug::log(LOG, " [PluginSystem] Plugin {} unloaded.", PLNAME);
// reload config to fix some stuf like e.g. unloadedPluginVars
g_pConfigManager->m_bForceReload = true;