This is an automated email from the git hooks/post-receive script.
richard pushed a commit to branch tor-browser-91.13.0esr-11.5-1 in repository tor-browser.
commit 25d82a1d4c4353e01a6c7936ef8c8683cbbecabf Author: Andrew Sutherland asutherland@asutherland.org AuthorDate: Tue Aug 9 10:20:09 2022 -0400
Bug 1770630 - Worker stream readers should contribute to busy count. r=jstutte, a=RyanVM --- dom/base/BodyStream.cpp | 9 +++++--- dom/base/BodyStream.h | 5 +++-- dom/fetch/FetchStreamReader.cpp | 14 ++++++------- dom/fetch/FetchStreamReader.h | 5 +++-- dom/fetch/FetchUtil.cpp | 5 ++--- dom/file/FileReader.cpp | 46 ++++++++++------------------------------- dom/file/FileReader.h | 1 + 7 files changed, 33 insertions(+), 52 deletions(-)
diff --git a/dom/base/BodyStream.cpp b/dom/base/BodyStream.cpp index 05ab478a5b23f..50781bba29583 100644 --- a/dom/base/BodyStream.cpp +++ b/dom/base/BodyStream.cpp @@ -115,8 +115,8 @@ void BodyStream::Create(JSContext* aCx, BodyStreamHolder* aStreamHolder, WorkerPrivate* workerPrivate = GetWorkerPrivateFromContext(aCx); MOZ_ASSERT(workerPrivate);
- RefPtr<WeakWorkerRef> workerRef = - WeakWorkerRef::Create(workerPrivate, [stream]() { stream->Close(); }); + RefPtr<StrongWorkerRef> workerRef = + StrongWorkerRef::Create(workerPrivate, "BodyStream", [stream]() { stream->Close(); });
if (NS_WARN_IF(!workerRef)) { aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR); @@ -215,6 +215,7 @@ void BodyStream::requestData(JSContext* aCx, JS::HandleObject aStream, ErrorPropagation(aCx, lock, aStream, rv); return; } + mAsyncWaitWorkerRef = mWorkerRef;
// All good. } @@ -254,6 +255,7 @@ void BodyStream::writeIntoReadRequestBuffer(JSContext* aCx, ErrorPropagation(aCx, lock, aStream, rv); return; } + mAsyncWaitWorkerRef = mWorkerRef;
// All good. } @@ -362,6 +364,7 @@ NS_IMETHODIMP BodyStream::OnInputStreamReady(nsIAsyncInputStream* aStream) { AssertIsOnOwningThread(); MOZ_DIAGNOSTIC_ASSERT(aStream); + mAsyncWaitWorkerRef = nullptr;
// Acquire |mMutex| in order to safely inspect |mState| and use |mGlobal|. Maybe<MutexAutoLock> lock; @@ -511,7 +514,7 @@ void BodyStream::ReleaseObjects(const MutexAutoLock& aProofOfLock) { // Let's dispatch a WorkerControlRunnable if the owning thread is a worker. if (mWorkerRef) { RefPtr<WorkerShutdown> r = - new WorkerShutdown(mWorkerRef->GetUnsafePrivate(), this); + new WorkerShutdown(mWorkerRef->Private(), this); Unused << NS_WARN_IF(!r->Dispatch()); return; } diff --git a/dom/base/BodyStream.h b/dom/base/BodyStream.h index 33b1166006d86..05c418d1a189f 100644 --- a/dom/base/BodyStream.h +++ b/dom/base/BodyStream.h @@ -27,7 +27,7 @@ class ErrorResult; namespace dom {
class BodyStream; -class WeakWorkerRef; +class StrongWorkerRef;
class BodyStreamHolder : public nsISupports { friend class BodyStream; @@ -168,7 +168,8 @@ class BodyStream final : public nsIInputStreamCallback, nsCOMPtr<nsIInputStream> mOriginalInputStream; nsCOMPtr<nsIAsyncInputStream> mInputStream;
- RefPtr<WeakWorkerRef> mWorkerRef; + RefPtr<StrongWorkerRef> mWorkerRef; + RefPtr<StrongWorkerRef> mAsyncWaitWorkerRef; };
} // namespace dom diff --git a/dom/fetch/FetchStreamReader.cpp b/dom/fetch/FetchStreamReader.cpp index 7e733b91d7243..ded9706d8a665 100644 --- a/dom/fetch/FetchStreamReader.cpp +++ b/dom/fetch/FetchStreamReader.cpp @@ -71,16 +71,14 @@ nsresult FetchStreamReader::Create(JSContext* aCx, nsIGlobalObject* aGlobal, WorkerPrivate* workerPrivate = GetWorkerPrivateFromContext(aCx); MOZ_ASSERT(workerPrivate);
- RefPtr<WeakWorkerRef> workerRef = - WeakWorkerRef::Create(workerPrivate, [streamReader]() { + RefPtr<StrongWorkerRef> workerRef = StrongWorkerRef::Create( + workerPrivate, "FetchStreamReader", [streamReader]() { MOZ_ASSERT(streamReader); MOZ_ASSERT(streamReader->mWorkerRef);
- WorkerPrivate* workerPrivate = streamReader->mWorkerRef->GetPrivate(); - MOZ_ASSERT(workerPrivate); - - streamReader->CloseAndRelease(workerPrivate->GetJSContext(), - NS_ERROR_DOM_INVALID_STATE_ERR); + streamReader->CloseAndRelease( + streamReader->mWorkerRef->Private()->GetJSContext(), + NS_ERROR_DOM_INVALID_STATE_ERR); });
if (NS_WARN_IF(!workerRef)) { @@ -191,6 +189,7 @@ void FetchStreamReader::StartConsuming(JSContext* aCx, JS::HandleObject aStream, if (NS_WARN_IF(aRv.Failed())) { return; } + mAsyncWaitWorkerRef = mWorkerRef; }
// nsIOutputStreamCallback interface @@ -201,6 +200,7 @@ FetchStreamReader::OnOutputStreamReady(nsIAsyncOutputStream* aStream) { MOZ_ASSERT(aStream == mPipeOut); MOZ_ASSERT(mReader);
+ mAsyncWaitWorkerRef = nullptr; if (mStreamClosed) { return NS_OK; } diff --git a/dom/fetch/FetchStreamReader.h b/dom/fetch/FetchStreamReader.h index 6b28136f8f551..80f1be2f056fd 100644 --- a/dom/fetch/FetchStreamReader.h +++ b/dom/fetch/FetchStreamReader.h @@ -17,7 +17,7 @@ namespace mozilla { namespace dom {
-class WeakWorkerRef; +class StrongWorkerRef;
class FetchStreamReader final : public nsIOutputStreamCallback, public PromiseNativeHandler { @@ -59,7 +59,8 @@ class FetchStreamReader final : public nsIOutputStreamCallback,
nsCOMPtr<nsIAsyncOutputStream> mPipeOut;
- RefPtr<WeakWorkerRef> mWorkerRef; + RefPtr<StrongWorkerRef> mWorkerRef; + RefPtr<StrongWorkerRef> mAsyncWaitWorkerRef;
JS::Heap<JSObject*> mReader;
diff --git a/dom/fetch/FetchUtil.cpp b/dom/fetch/FetchUtil.cpp index 330ef6dda6a9a..81369711a2688 100644 --- a/dom/fetch/FetchUtil.cpp +++ b/dom/fetch/FetchUtil.cpp @@ -259,14 +259,13 @@ class WorkerStreamOwner final { nsIAsyncInputStream* aStream, WorkerPrivate* aWorker) { RefPtr<WorkerStreamOwner> self = new WorkerStreamOwner(aStream);
- self->mWorkerRef = WeakWorkerRef::Create(aWorker, [self]() { + self->mWorkerRef = StrongWorkerRef::Create(aWorker, "JSStreamConsumer", [self]() { if (self->mStream) { // If this Close() calls JSStreamConsumer::OnInputStreamReady and drops // the last reference to the JSStreamConsumer, 'this' will not be // destroyed since ~JSStreamConsumer() only enqueues a Destroyer. self->mStream->Close(); self->mStream = nullptr; - self->mWorkerRef = nullptr; } });
@@ -299,7 +298,7 @@ class WorkerStreamOwner final { // Read from any thread but only set/cleared on the worker thread. The // lifecycle of WorkerStreamOwner prevents concurrent read/clear. nsCOMPtr<nsIAsyncInputStream> mStream; - RefPtr<WeakWorkerRef> mWorkerRef; + RefPtr<StrongWorkerRef> mWorkerRef; };
class JSStreamConsumer final : public nsIInputStreamCallback { diff --git a/dom/file/FileReader.cpp b/dom/file/FileReader.cpp index 1884d9a69794d..a76b9eafb50bc 100644 --- a/dom/file/FileReader.cpp +++ b/dom/file/FileReader.cpp @@ -615,15 +615,15 @@ FileReader::Notify(nsITimer* aTimer) { // InputStreamCallback NS_IMETHODIMP FileReader::OnInputStreamReady(nsIAsyncInputStream* aStream) { - if (mReadyState != LOADING || aStream != mAsyncStream) { - return NS_OK; - } - // We use this class to decrease the busy counter at the end of this method. // In theory we can do it immediatelly but, for debugging reasons, we want to // be 100% sure we have a workerRef when OnLoadEnd() is called. FileReaderDecreaseBusyCounter RAII(this);
+ if (mReadyState != LOADING || aStream != mAsyncStream) { + return NS_OK; + } + uint64_t count; nsresult rv = aStream->Available(&count);
@@ -722,14 +722,7 @@ void FileReader::Abort() {
MOZ_ASSERT(mReadyState == LOADING);
- ClearProgressEventTimer(); - - if (mAsyncWaitRunnable) { - mAsyncWaitRunnable->Cancel(); - mAsyncWaitRunnable = nullptr; - } - - mReadyState = DONE; + Cleanup();
// XXX The spec doesn't say this mError = DOMException::Create(NS_ERROR_DOM_ABORT_ERR); @@ -738,30 +731,12 @@ void FileReader::Abort() { SetDOMStringToNull(mResult); mResultArrayBuffer = nullptr;
- // If we have the stream and the busy-count is not 0, it means that we are - // waiting for an OnInputStreamReady() call. Let's abort the current - // AsyncWait() calling it again with a nullptr callback. See - // nsIAsyncInputStream.idl. - if (mAsyncStream && mBusyCount) { - mAsyncStream->AsyncWait(/* callback */ nullptr, - /* aFlags*/ 0, - /* aRequestedCount */ 0, mTarget); - DecreaseBusyCounter(); - MOZ_ASSERT(mBusyCount == 0); - - mAsyncStream->Close(); - } - - mAsyncStream = nullptr; mBlob = nullptr;
- // Clean up memory buffer - FreeFileData(); - // Dispatch the events DispatchProgressEvent(nsLiteralString(ABORT_STR)); DispatchProgressEvent(nsLiteralString(LOADEND_STR)); -} // namespace dom +}
nsresult FileReader::IncreaseBusyCounter() { if (mWeakWorkerRef && mBusyCount++ == 0) { @@ -791,7 +766,7 @@ void FileReader::DecreaseBusyCounter() { } }
-void FileReader::Shutdown() { +void FileReader::Cleanup() { mReadyState = DONE;
if (mAsyncWaitRunnable) { @@ -807,11 +782,12 @@ void FileReader::Shutdown() { ClearProgressEventTimer(); FreeFileData(); mResultArrayBuffer = nullptr; +}
- if (mWeakWorkerRef && mBusyCount != 0) { - mStrongWorkerRef = nullptr; +void FileReader::Shutdown() { + Cleanup(); + if (mWeakWorkerRef) { mWeakWorkerRef = nullptr; - mBusyCount = 0; } }
diff --git a/dom/file/FileReader.h b/dom/file/FileReader.h index 6b48c54043fa7..4c86886b894b6 100644 --- a/dom/file/FileReader.h +++ b/dom/file/FileReader.h @@ -156,6 +156,7 @@ class FileReader final : public DOMEventTargetHelper, nsresult IncreaseBusyCounter(); void DecreaseBusyCounter();
+ void Cleanup(); void Shutdown();
char* mFileData;