diff options
author | George Hazan <ghazan@miranda.im> | 2019-10-30 15:43:54 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2019-10-30 15:43:54 +0300 |
commit | cd61504e707fbc493b79b05afaca6316b3b4e642 (patch) | |
tree | 00f7e8d70978feceb373935144b5d62145c2891b /src | |
parent | 2c474ad20324f19ad309d865f5aea7a51a1f2ef6 (diff) |
fixes #2111 (Pascal plugins don't free their resource after dynamic unload)
Diffstat (limited to 'src')
-rw-r--r-- | src/mir_app/src/CMPluginBase.cpp | 35 |
1 files changed, 22 insertions, 13 deletions
diff --git a/src/mir_app/src/CMPluginBase.cpp b/src/mir_app/src/CMPluginBase.cpp index ffe6877c27..746981b7f8 100644 --- a/src/mir_app/src/CMPluginBase.cpp +++ b/src/mir_app/src/CMPluginBase.cpp @@ -99,14 +99,35 @@ MIR_APP_DLL(CMPluginBase&) GetPluginByInstance(HINSTANCE hInst) ///////////////////////////////////////////////////////////////////////////////////////// // stubs for pascal plugins +static void wipePluginData(CMPluginBase *pPlugin) +{ + if (g_bMirandaTerminated) + return; + + KillModuleMenus(pPlugin); + KillModuleFonts(pPlugin); + KillModuleColours(pPlugin); + KillModuleEffects(pPlugin); + KillModuleIcons(pPlugin); + KillModuleHotkeys(pPlugin); + KillModuleSounds(pPlugin); + KillModuleExtraIcons(pPlugin); + KillModuleSrmmIcons(pPlugin); + KillModuleToolbarIcons(pPlugin); + KillModuleOptions(pPlugin); +} + +// emulates the call of CMPluginBase::CMPluginBase for Pascal plugins EXTERN_C MIR_APP_DLL(void) RegisterPlugin(CMPluginBase *pPlugin) { if (pPlugin->getInst() != nullptr) g_arPlugins.insert(pPlugin); } +// emulates the call of CMPluginBase::~CMPluginBase for Pascal plugins EXTERN_C MIR_APP_DLL(void) UnregisterPlugin(CMPluginBase *pPlugin) { + wipePluginData(pPlugin); g_arPlugins.remove(pPlugin); } @@ -128,19 +149,7 @@ CMPluginBase::CMPluginBase(const char *moduleName, const PLUGININFOEX &pInfo) : CMPluginBase::~CMPluginBase() { - if (!g_bMirandaTerminated) { - KillModuleMenus(this); - KillModuleFonts(this); - KillModuleColours(this); - KillModuleEffects(this); - KillModuleIcons(this); - KillModuleHotkeys(this); - KillModuleSounds(this); - KillModuleExtraIcons(this); - KillModuleSrmmIcons(this); - KillModuleToolbarIcons(this); - KillModuleOptions(this); - } + wipePluginData(this); if (m_hLogger) { mir_closeLog(m_hLogger); |