Bug 1652126: Obtain an OffThreadToken immediately so parse tasks can be canceled anytime, and clean up dangling Runnables during cancellation. r=smaug

Differential Revision: https://phabricator.services.mozilla.com/D89465
This commit is contained in:
Denis Palmeiro
2020-09-11 15:28:04 +00:00
parent 550b941b20
commit 274ab31942
3 changed files with 53 additions and 15 deletions

View File

@@ -58,6 +58,9 @@ NS_IMPL_CYCLE_COLLECTION_CLASS(ScriptLoadRequest)
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(ScriptLoadRequest)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mFetchOptions, mCacheInfo)
tmp->mScript = nullptr;
if (Runnable* runnable = tmp->mRunnable.exchange(nullptr)) {
runnable->Release();
}
tmp->DropBytecodeCacheReferences();
tmp->MaybeUnblockOnload();
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
@@ -90,6 +93,7 @@ ScriptLoadRequest::ScriptLoadRequest(ScriptKind aKind, nsIURI* aURI,
mIsTracking(false),
mFetchOptions(aFetchOptions),
mOffThreadToken(nullptr),
mRunnable(nullptr),
mScriptTextLength(0),
mScriptBytecode(),
mBytecodeOffset(0),
@@ -147,6 +151,14 @@ void ScriptLoadRequest::MaybeCancelOffThreadScript() {
MOZ_ASSERT(IsBytecode());
JS::CancelOffThreadScriptDecoder(cx, mOffThreadToken);
}
// Cancellation request above should guarantee removal of the parse task, so
// releasing the runnable should be safe to do here.
if (Runnable* runnable = mRunnable.exchange(nullptr)) {
runnable->Release();
}
MaybeUnblockOnload();
mOffThreadToken = nullptr;
}