mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-15 06:15:43 +00:00
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:
parent
a4ad0dd1bf
commit
0e162342d3
@ -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()
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user