Fix leak when two documents race to load the same script (but leave for later fixing that we load the same script twice). b=392542 r=enndeakin sr=bzbarsky a=roc

This commit is contained in:
dbaron@dbaron.org 2007-08-21 09:47:48 -07:00
parent a4ad0dd1bf
commit 0e162342d3

View File

@ -269,9 +269,27 @@ nsXULPrototypeCache::GetScript(nsIURI* aURI, PRUint32 *aLangID)
}
/* static */
PR_STATIC_CALLBACK(PLDHashOperator)
ReleaseScriptObjectCallback(nsIURI* aKey, CacheScriptEntry &aData, void* aClosure)
{
nsCOMPtr<nsIScriptRuntime> rt;
if (NS_SUCCEEDED(NS_GetScriptRuntimeByID(aData.mScriptTypeID, getter_AddRefs(rt))))
rt->DropScriptObject(aData.mScriptObject);
return PL_DHASH_REMOVE;
}
nsresult
nsXULPrototypeCache::PutScript(nsIURI* aURI, PRUint32 aLangID, void* aScriptObject)
{
CacheScriptEntry existingEntry;
if (mScriptTable.Get(aURI, &existingEntry)) {
NS_WARNING("loaded the same script twice (bug 392650)");
// Reuse the callback used for enumeration in FlushScripts
ReleaseScriptObjectCallback(aURI, existingEntry, nsnull);
}
CacheScriptEntry entry = {aLangID, aScriptObject};
NS_ENSURE_TRUE(mScriptTable.Put(aURI, entry), NS_ERROR_OUT_OF_MEMORY);
@ -287,16 +305,6 @@ nsXULPrototypeCache::PutScript(nsIURI* aURI, PRUint32 aLangID, void* aScriptObje
return rv;
}
/* static */
PR_STATIC_CALLBACK(PLDHashOperator)
ReleaseScriptObjectCallback(nsIURI* aKey, CacheScriptEntry &aData, void* aClosure)
{
nsCOMPtr<nsIScriptRuntime> rt;
if (NS_SUCCEEDED(NS_GetScriptRuntimeByID(aData.mScriptTypeID, getter_AddRefs(rt))))
rt->DropScriptObject(aData.mScriptObject);
return PL_DHASH_REMOVE;
}
void
nsXULPrototypeCache::FlushScripts()
{