fixed crash bug when unloading a plugin with a weak ntvref
--HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%401127
This commit is contained in:
parent
bf5a50b8c4
commit
430e63d6cd
@ -125,13 +125,6 @@ CExtension::~CExtension()
|
|||||||
{
|
{
|
||||||
m_pLib->CloseLibrary();
|
m_pLib->CloseLibrary();
|
||||||
}
|
}
|
||||||
|
|
||||||
List<WeakNative *>::iterator iter;
|
|
||||||
for (iter=m_WeakNatives.begin(); iter!=m_WeakNatives.end(); iter++)
|
|
||||||
{
|
|
||||||
delete (*iter);
|
|
||||||
}
|
|
||||||
m_WeakNatives.clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CExtension::MarkAllLoaded()
|
void CExtension::MarkAllLoaded()
|
||||||
@ -156,6 +149,17 @@ void CExtension::AddPlugin(IPlugin *pPlugin)
|
|||||||
void CExtension::RemovePlugin(IPlugin *pPlugin)
|
void CExtension::RemovePlugin(IPlugin *pPlugin)
|
||||||
{
|
{
|
||||||
m_Plugins.remove(pPlugin);
|
m_Plugins.remove(pPlugin);
|
||||||
|
|
||||||
|
List<WeakNative>::iterator iter = m_WeakNatives.begin();
|
||||||
|
while (iter != m_WeakNatives.end())
|
||||||
|
{
|
||||||
|
if ((*iter).pl == pPlugin)
|
||||||
|
{
|
||||||
|
iter = m_WeakNatives.erase(iter);
|
||||||
|
} else {
|
||||||
|
iter++;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CExtension::SetError(const char *error)
|
void CExtension::SetError(const char *error)
|
||||||
@ -546,7 +550,7 @@ void CExtensionManager::BindAllNativesToPlugin(IPlugin *pPlugin)
|
|||||||
{
|
{
|
||||||
set = true;
|
set = true;
|
||||||
} else {
|
} else {
|
||||||
WeakNative *wkn = new WeakNative((CPlugin *)pPlugin, idx);
|
WeakNative wkn = WeakNative((CPlugin *)pPlugin, idx);
|
||||||
pExt->m_WeakNatives.push_back(wkn);
|
pExt->m_WeakNatives.push_back(wkn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -594,13 +598,12 @@ bool CExtensionManager::UnloadExtension(IExtension *_pExt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Unbound weak natives */
|
/* Unbound weak natives */
|
||||||
WeakNative *wkn;
|
List<WeakNative>::iterator wkn_iter;
|
||||||
List<WeakNative *>::iterator wkn_iter;
|
|
||||||
for (wkn_iter=pExt->m_WeakNatives.begin(); wkn_iter!=pExt->m_WeakNatives.end(); wkn_iter++)
|
for (wkn_iter=pExt->m_WeakNatives.begin(); wkn_iter!=pExt->m_WeakNatives.end(); wkn_iter++)
|
||||||
{
|
{
|
||||||
wkn = (*wkn_iter);
|
WeakNative & wkn = (*wkn_iter);
|
||||||
sp_context_t *ctx = wkn->pl->GetContext();
|
sp_context_t *ctx = wkn.pl->GetContext();
|
||||||
ctx->natives[wkn->idx].status = SP_NATIVE_UNBOUND;
|
ctx->natives[wkn.idx].status = SP_NATIVE_UNBOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Notify and/or unload all dependencies */
|
/* Notify and/or unload all dependencies */
|
||||||
|
@ -64,7 +64,7 @@ private:
|
|||||||
List<SMInterface *> m_Interfaces;
|
List<SMInterface *> m_Interfaces;
|
||||||
List<IPlugin *> m_Plugins;
|
List<IPlugin *> m_Plugins;
|
||||||
List<const sp_nativeinfo_t *> m_Natives;
|
List<const sp_nativeinfo_t *> m_Natives;
|
||||||
List<WeakNative *> m_WeakNatives;
|
List<WeakNative> m_WeakNatives;
|
||||||
PluginId m_PlId;
|
PluginId m_PlId;
|
||||||
unsigned int unload_code;
|
unsigned int unload_code;
|
||||||
bool m_FullyLoaded;
|
bool m_FullyLoaded;
|
||||||
|
Loading…
Reference in New Issue
Block a user