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:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user