Add a state variable to CPlugin to indicate queue/list membership.

This commit is contained in:
David Anderson
2015-10-31 17:25:59 -07:00
parent 7cc911ae58
commit 9e4fff3362
2 changed files with 50 additions and 47 deletions
+22 -9
View File
@@ -55,7 +55,7 @@ IdentityType_t g_PluginIdent = 0;
CPlugin::CPlugin(const char *file)
: m_serial(0),
m_status(Plugin_Uncompiled),
m_WaitingToUnload(false),
m_state(PluginState::Unregistered),
m_AddedLibraries(false),
m_SilentFailure(false),
m_FakeNativesMissing(false),
@@ -978,11 +978,13 @@ void CPluginManager::LoadAutoPlugin(const char *plugin)
void CPluginManager::AddPlugin(CPlugin *pPlugin)
{
for (ListenerIter iter(m_listeners); !iter.done(); iter.next())
(*iter)->OnPluginCreated(pPlugin);
m_plugins.append(pPlugin);
m_LoadLookup.insert(pPlugin->GetFilename(), pPlugin);
pPlugin->SetRegistered();
for (ListenerIter iter(m_listeners); !iter.done(); iter.next())
(*iter)->OnPluginCreated(pPlugin);
}
void CPluginManager::LoadAll_SecondPass()
@@ -1125,6 +1127,18 @@ bool CPlugin::ForEachRequiredLib(ke::Lambda<bool(const char *)> callback)
return true;
}
void CPlugin::SetRegistered()
{
assert(m_state == PluginState::Unregistered);
m_state = PluginState::Registered;
}
void CPlugin::SetWaitingToUnload()
{
assert(m_state == PluginState::Registered);
m_state = PluginState::WaitingToUnload;
}
void CPluginManager::LoadExtensions(CPlugin *pPlugin)
{
auto callback = [pPlugin] (const sp_pubvar_t *pubvar, const CPlugin::ExtVar& ext) -> bool
@@ -1366,11 +1380,6 @@ void CPluginManager::TryRefreshDependencies(CPlugin *pPlugin)
bool CPluginManager::UnloadPlugin(IPlugin *plugin)
{
CPlugin *pPlugin = (CPlugin *)plugin;
// If we're already in the unload queue, just wait.
if (pPlugin->WaitingToUnload())
return false;
return ScheduleUnload(pPlugin);
}
@@ -1379,6 +1388,10 @@ bool CPluginManager::ScheduleUnload(CPlugin *pPlugin)
// Should not be recursively removing.
assert(m_plugins.contains(pPlugin));
// If we're already in the unload queue, just wait.
if (pPlugin->State() == PluginState::WaitingToUnload)
return false;
IPluginContext *pContext = pPlugin->GetBaseContext();
if (pContext && pContext->IsInExec()) {
ke::Lambda<void()> callback = [this, pPlugin]() {