1
0

Plugin reload <plugin_name> feature (#4942)

+ Add `reload <pluginname>`
* Fixes #365

Co-authored-by: Alexander Harkness <me@bearbin.net>
Co-authored-by: pwnOrbitals <c.de-claverie@pm.me>
Co-authored-by: Tiger Wang <ziwei.tiger@outlook.com>
This commit is contained in:
[IPSA] Chris de Claverie
2020-09-28 00:15:03 +02:00
committed by GitHub
parent 410d6c0045
commit 9a548b3b3e
6 changed files with 89 additions and 28 deletions

View File

@@ -165,35 +165,54 @@ void cPluginManager::InsertDefaultPlugins(cSettingsRepositoryInterface & a_Setti
void cPluginManager::Tick(float a_Dt)
{
// Unload plugins that have been scheduled for unloading:
AStringVector PluginsToUnload;
decltype(m_PluginsNeedAction) PluginsNeedAction;
{
cCSLock Lock(m_CSPluginsToUnload);
std::swap(m_PluginsToUnload, PluginsToUnload);
cCSLock Lock(m_CSPluginsNeedAction);
std::swap(m_PluginsNeedAction, PluginsNeedAction);
}
for (auto & folder: PluginsToUnload)
// Process deferred actions:
for (auto & CurrentPlugin : PluginsNeedAction)
{
bool HasUnloaded = false;
bool HasFound = false;
for (auto & plugin: m_Plugins)
auto & Action = CurrentPlugin.first;
auto & Folder = CurrentPlugin.second;
bool WasLoaded = false;
bool WasFound = false;
for (auto & Plugin: m_Plugins)
{
if (plugin->GetFolderName() == folder)
if (Plugin->GetFolderName() == Folder)
{
HasFound = true;
if (plugin->IsLoaded())
WasFound = true;
if (Plugin->IsLoaded())
{
plugin->Unload();
HasUnloaded = true;
switch (Action)
{
case PluginAction::Reload :
{
// Reload plugins by unloading, then loading:
Plugin->Unload();
Plugin->Load();
break;
}
case PluginAction::Unload :
{
// Unload plugins that have been scheduled for unloading:
Plugin->Unload();
break;
}
}
WasLoaded = true;
}
}
}
if (!HasFound)
if (!WasFound)
{
LOG("Cannot unload plugin in folder \"%s\", there's no such plugin folder", folder.c_str());
LOG("Cannot act on plugin in folder \"%s\", there's no such plugin folder", Folder.c_str());
}
else if (!HasUnloaded)
else if (!WasLoaded)
{
LOG("Cannot unload plugin in folder \"%s\", it has not been loaded.", folder.c_str());
LOG("Cannot act on plugin in folder \"%s\", it has not been loaded.", Folder.c_str());
}
} // for plugin - m_Plugins[]
@@ -1317,8 +1336,18 @@ void cPluginManager::UnloadPluginsNow()
void cPluginManager::UnloadPlugin(const AString & a_PluginFolder)
{
cCSLock Lock(m_CSPluginsToUnload);
m_PluginsToUnload.push_back(a_PluginFolder);
cCSLock Lock(m_CSPluginsNeedAction);
m_PluginsNeedAction.emplace_back(PluginAction::Unload, a_PluginFolder);
}
void cPluginManager::ReloadPlugin(const AString & a_PluginFolder)
{
cCSLock Lock(m_CSPluginsNeedAction);
m_PluginsNeedAction.emplace_back(PluginAction::Reload, a_PluginFolder);
}