fixed plugins being loaded twice if they were loaded previously
--HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40389
This commit is contained in:
parent
326ac67c68
commit
21123f4c74
@ -634,7 +634,7 @@ void CPluginManager::LoadPluginsFromDir(const char *basedir, const char *localpa
|
||||
}
|
||||
|
||||
//well i have discovered that gabe newell is very fat, so i wrote this comment now
|
||||
bool CPluginManager::_LoadPlugin(CPlugin **_plugin, const char *path, bool debug, PluginType type, char error[], size_t err_max)
|
||||
LoadRes CPluginManager::_LoadPlugin(CPlugin **_plugin, const char *path, bool debug, PluginType type, char error[], size_t err_max)
|
||||
{
|
||||
/**
|
||||
* Does this plugin already exist?
|
||||
@ -642,19 +642,18 @@ bool CPluginManager::_LoadPlugin(CPlugin **_plugin, const char *path, bool debug
|
||||
CPlugin *pPlugin;
|
||||
if (sm_trie_retrieve(m_LoadLookup, path, (void **)&pPlugin))
|
||||
{
|
||||
/* First check the type */
|
||||
PluginType type = pPlugin->GetType();
|
||||
if (type == PluginType_Private
|
||||
|| type == PluginType_Global)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
/* Check to see if we should try reloading it */
|
||||
if (pPlugin->GetStatus() == Plugin_BadLoad
|
||||
|| pPlugin->GetStatus() == Plugin_Error
|
||||
|| pPlugin->GetStatus() == Plugin_Failed)
|
||||
{
|
||||
UnloadPlugin(pPlugin);
|
||||
} else {
|
||||
if (_plugin)
|
||||
{
|
||||
*_plugin = pPlugin;
|
||||
}
|
||||
return LoadRes_AlreadyLoaded;
|
||||
}
|
||||
}
|
||||
|
||||
@ -732,19 +731,27 @@ bool CPluginManager::_LoadPlugin(CPlugin **_plugin, const char *path, bool debug
|
||||
*_plugin = pPlugin;
|
||||
}
|
||||
|
||||
return (pPlugin->GetStatus() == Plugin_Loaded);
|
||||
return (pPlugin->GetStatus() == Plugin_Loaded) ? LoadRes_Successful : LoadRes_Failure;
|
||||
}
|
||||
|
||||
IPlugin *CPluginManager::LoadPlugin(const char *path, bool debug, PluginType type, char error[], size_t err_max)
|
||||
IPlugin *CPluginManager::LoadPlugin(const char *path, bool debug, PluginType type, char error[], size_t err_max, bool *wasloaded)
|
||||
{
|
||||
CPlugin *pl;
|
||||
LoadRes res;
|
||||
|
||||
if (!_LoadPlugin(&pl, path, debug, type, error, err_max))
|
||||
*wasloaded = false;
|
||||
if ((res=_LoadPlugin(&pl, path, debug, type, error, err_max)) == LoadRes_Failure)
|
||||
{
|
||||
delete pl;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (res == LoadRes_AlreadyLoaded)
|
||||
{
|
||||
*wasloaded = true;
|
||||
return pl;
|
||||
}
|
||||
|
||||
AddPlugin(pl);
|
||||
|
||||
/* Run second pass if we need to */
|
||||
@ -763,15 +770,19 @@ IPlugin *CPluginManager::LoadPlugin(const char *path, bool debug, PluginType typ
|
||||
void CPluginManager::LoadAutoPlugin(const char *plugin)
|
||||
{
|
||||
CPlugin *pl;
|
||||
LoadRes res;
|
||||
char error[255] = "Unknown error";
|
||||
|
||||
if (!_LoadPlugin(&pl, plugin, false, PluginType_MapUpdated, error, sizeof(error)))
|
||||
if ((res=_LoadPlugin(&pl, plugin, false, PluginType_MapUpdated, error, sizeof(error))) == LoadRes_Failure)
|
||||
{
|
||||
g_Logger.LogError("[SM] Failed to load plugin \"%s\": %s", plugin, error);
|
||||
pl->SetErrorState(Plugin_Failed, "%s", error);
|
||||
}
|
||||
|
||||
if (res == LoadRes_Successful)
|
||||
{
|
||||
AddPlugin(pl);
|
||||
}
|
||||
}
|
||||
|
||||
void CPluginManager::AddPlugin(CPlugin *pPlugin)
|
||||
@ -1410,8 +1421,15 @@ void CPluginManager::OnRootConsoleCommand(const char *command, unsigned int argc
|
||||
}
|
||||
|
||||
char error[128];
|
||||
bool wasloaded;
|
||||
const char *filename = g_RootMenu.GetArgument(3);
|
||||
IPlugin *pl = LoadPlugin(filename, false, PluginType_MapUpdated, error, sizeof(error));
|
||||
IPlugin *pl = LoadPlugin(filename, false, PluginType_MapUpdated, error, sizeof(error), &wasloaded);
|
||||
|
||||
if (wasloaded)
|
||||
{
|
||||
g_RootMenu.ConsolePrint("[SM] Plugin %s is already loaded.", filename);
|
||||
return;
|
||||
}
|
||||
|
||||
if (pl)
|
||||
{
|
||||
|
@ -89,6 +89,13 @@ struct ContextPair
|
||||
IVirtualMachine *vm;
|
||||
};
|
||||
|
||||
enum LoadRes
|
||||
{
|
||||
LoadRes_Successful,
|
||||
LoadRes_AlreadyLoaded,
|
||||
LoadRes_Failure
|
||||
};
|
||||
|
||||
class CPlugin : public IPlugin
|
||||
{
|
||||
friend class CPluginManager;
|
||||
@ -235,7 +242,8 @@ public: //IPluginManager
|
||||
bool debug,
|
||||
PluginType type,
|
||||
char error[],
|
||||
size_t err_max);
|
||||
size_t err_max,
|
||||
bool *wasloaded);
|
||||
bool UnloadPlugin(IPlugin *plugin);
|
||||
IPlugin *FindPluginByContext(const sp_context_t *ctx);
|
||||
unsigned int GetPluginCount();
|
||||
@ -302,7 +310,7 @@ public:
|
||||
void ReloadOrUnloadPlugins();
|
||||
|
||||
private:
|
||||
bool _LoadPlugin(CPlugin **pPlugin, const char *path, bool debug, PluginType type, char error[], size_t err_max);
|
||||
LoadRes _LoadPlugin(CPlugin **pPlugin, const char *path, bool debug, PluginType type, char error[], size_t err_max);
|
||||
|
||||
void LoadAutoPlugin(const char *plugin);
|
||||
|
||||
|
@ -251,13 +251,15 @@ namespace SourceMod
|
||||
* @param type Lifetime of the plugin.
|
||||
* @param error Buffer to hold any error message.
|
||||
* @param err_max Maximum length of error message buffer.
|
||||
* @param wasloaded Stores if the plugin is already loaded.
|
||||
* @return A new plugin pointer on success, false otherwise.
|
||||
*/
|
||||
virtual IPlugin *LoadPlugin(const char *path,
|
||||
bool debug,
|
||||
PluginType type,
|
||||
char error[],
|
||||
size_t err_max) =0;
|
||||
size_t err_max,
|
||||
bool *wasloaded) =0;
|
||||
|
||||
/**
|
||||
* @brief Attempts to unload a plugin.
|
||||
|
Loading…
Reference in New Issue
Block a user