diff --git a/core/logic/PluginSys.cpp b/core/logic/PluginSys.cpp index 3bd6ef73..0d2edf92 100644 --- a/core/logic/PluginSys.cpp +++ b/core/logic/PluginSys.cpp @@ -1478,23 +1478,30 @@ void CPluginManager::TryRefreshDependencies(CPlugin *pPlugin) bool CPluginManager::UnloadPlugin(IPlugin *plugin) { - CPlugin *pPlugin = (CPlugin *)plugin; + return ScheduleUnload((CPlugin *)plugin); +} - /* This prevents removal during insertion or anything else weird */ - if (m_plugins.find(pPlugin) == m_plugins.end()) - { - return false; - } +bool CPluginManager::ScheduleUnload(CPlugin *pPlugin) +{ + // Should not be recursively removing. + assert(m_plugins.find(pPlugin) != m_plugins.end()); - IPluginContext *pContext = plugin->GetBaseContext(); - if (pContext != NULL && pContext->IsInExec()) + IPluginContext *pContext = pPlugin->GetBaseContext(); + if (pContext && pContext->IsInExec()) { char buffer[255]; - ke::SafeSprintf(buffer, sizeof(buffer), "sm plugins unload %s\n", plugin->GetFilename()); + ke::SafeSprintf(buffer, sizeof(buffer), "sm plugins unload %s\n", pPlugin->GetFilename()); engine->ServerCommand(buffer); return false; } + // No need to schedule an unload, we can unload immediately. + UnloadPluginImpl(pPlugin); + return true; +} + +void CPluginManager::UnloadPluginImpl(CPlugin *pPlugin) +{ /* Remove us from the lookup table and linked list */ m_plugins.remove(pPlugin); m_LoadLookup.remove(pPlugin->m_filename); @@ -1535,8 +1542,6 @@ bool CPluginManager::UnloadPlugin(IPlugin *plugin) /* Tell the plugin to delete itself */ delete pPlugin; - - return true; } IPlugin *CPluginManager::FindPluginByContext(const sp_context_t *ctx) diff --git a/core/logic/PluginSys.h b/core/logic/PluginSys.h index 2073f0e3..7fa9a929 100644 --- a/core/logic/PluginSys.h +++ b/core/logic/PluginSys.h @@ -455,6 +455,9 @@ private: bool FindOrRequirePluginDeps(CPlugin *pPlugin, char *error, size_t maxlength); void _SetPauseState(CPlugin *pPlugin, bool pause); + + bool ScheduleUnload(CPlugin *plugin); + void UnloadPluginImpl(CPlugin *plugin); protected: /** * Caching internal objects diff --git a/core/logic/smn_fakenatives.cpp b/core/logic/smn_fakenatives.cpp index 40baa604..c4c7cf8a 100644 --- a/core/logic/smn_fakenatives.cpp +++ b/core/logic/smn_fakenatives.cpp @@ -392,7 +392,6 @@ static cell_t FormatNativeString(IPluginContext *pContext, const cell_t *params) } /* Get buffer information */ - int err; char *output_buffer; char *format_buffer;