diff options
| author | Vaxry <vaxry@vaxry.net> | 2024-04-22 15:46:43 +0100 |
|---|---|---|
| committer | Vaxry <vaxry@vaxry.net> | 2024-04-22 15:46:43 +0100 |
| commit | 450343b7b83ba659f6a932092aff922cc1cddd2b (patch) | |
| tree | cc888b2c47b02310cd6c629e08be44507e64abcf /src/plugins/PluginSystem.cpp | |
| parent | e1644e91ead7cdef5d08bfe6a579c4478a816a8e (diff) | |
pluginsystem: unload entire plugin before calling dlclose()
fixes #5689
Diffstat (limited to 'src/plugins/PluginSystem.cpp')
| -rw-r--r-- | src/plugins/PluginSystem.cpp | 11 |
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; |
