From 77bb9e9b0e2b3b5167ddb93b17a1b4d74820ff45 Mon Sep 17 00:00:00 2001 From: Olli Pettay Date: Fri, 8 Oct 2021 19:29:37 +0000 Subject: [PATCH] Bug 1734811 - consider to use higher priority for the imglib tasks r=tnikkel Depends on D127935 Differential Revision: https://phabricator.services.mozilla.com/D127936 --- image/DecodePool.cpp | 2 +- image/IDecodingTask.cpp | 4 ++-- image/Image.cpp | 2 +- image/ProgressTracker.cpp | 18 +++++++++--------- image/ProgressTracker.h | 11 ++++++----- image/VectorImage.cpp | 4 ++-- image/imgRequest.cpp | 2 +- image/imgRequestProxy.cpp | 5 +++-- xpcom/threads/nsThreadUtils.cpp | 4 ++-- xpcom/threads/nsThreadUtils.h | 2 +- 10 files changed, 28 insertions(+), 26 deletions(-) diff --git a/image/DecodePool.cpp b/image/DecodePool.cpp index 7adf5fd999f1..d47a7b01bd88 100644 --- a/image/DecodePool.cpp +++ b/image/DecodePool.cpp @@ -139,7 +139,7 @@ class DecodingTask final : public Task { explicit DecodingTask(RefPtr&& aTask) : Task(false, aTask->Priority() == TaskPriority::eLow ? EventQueuePriority::Normal - : EventQueuePriority::MediumHigh), + : EventQueuePriority::RenderBlocking), mTask(aTask) {} bool Run() override { diff --git a/image/IDecodingTask.cpp b/image/IDecodingTask.cpp index f78995206d82..d4a3b6f1c552 100644 --- a/image/IDecodingTask.cpp +++ b/image/IDecodingTask.cpp @@ -84,7 +84,7 @@ void IDecodingTask::NotifyProgress(NotNull aImage, // We're forced to notify asynchronously. NotNull> image = aImage; - mEventTarget->Dispatch(CreateMediumHighRunnable(NS_NewRunnableFunction( + mEventTarget->Dispatch(CreateRenderBlockingRunnable(NS_NewRunnableFunction( "IDecodingTask::NotifyProgress", [=]() -> void { image->NotifyProgress(progress, invalidRect, @@ -125,7 +125,7 @@ void IDecodingTask::NotifyDecodeComplete(NotNull aImage, // We're forced to notify asynchronously. NotNull> image = aImage; - mEventTarget->Dispatch(CreateMediumHighRunnable(NS_NewRunnableFunction( + mEventTarget->Dispatch(CreateRenderBlockingRunnable(NS_NewRunnableFunction( "IDecodingTask::NotifyDecodeComplete", [=]() -> void { image->NotifyDecodeComplete( diff --git a/image/Image.cpp b/image/Image.cpp index c1ed4d1317e4..618fc991705e 100644 --- a/image/Image.cpp +++ b/image/Image.cpp @@ -537,7 +537,7 @@ void ImageResource::SendOnUnlockedDraw(uint32_t aFlags) { tracker->OnUnlockedDraw(); } }); - eventTarget->Dispatch(CreateMediumHighRunnable(ev.forget()), + eventTarget->Dispatch(CreateRenderBlockingRunnable(ev.forget()), NS_DISPATCH_NORMAL); } } diff --git a/image/ProgressTracker.cpp b/image/ProgressTracker.cpp index a9a4b4c73f31..bd1b9de62ab1 100644 --- a/image/ProgressTracker.cpp +++ b/image/ProgressTracker.cpp @@ -153,28 +153,28 @@ class AsyncNotifyRunnable : public Runnable { nsTArray> mObservers; }; -ProgressTracker::MediumHighRunnable::MediumHighRunnable( +ProgressTracker::RenderBlockingRunnable::RenderBlockingRunnable( already_AddRefed&& aEvent) : PrioritizableRunnable(std::move(aEvent), - nsIRunnablePriority::PRIORITY_MEDIUMHIGH) {} + nsIRunnablePriority::PRIORITY_RENDER_BLOCKING) {} -void ProgressTracker::MediumHighRunnable::AddObserver( +void ProgressTracker::RenderBlockingRunnable::AddObserver( IProgressObserver* aObserver) { static_cast(mRunnable.get())->AddObserver(aObserver); } -void ProgressTracker::MediumHighRunnable::RemoveObserver( +void ProgressTracker::RenderBlockingRunnable::RemoveObserver( IProgressObserver* aObserver) { static_cast(mRunnable.get())->RemoveObserver(aObserver); } /* static */ -already_AddRefed -ProgressTracker::MediumHighRunnable::Create( +already_AddRefed +ProgressTracker::RenderBlockingRunnable::Create( already_AddRefed&& aEvent) { MOZ_ASSERT(NS_IsMainThread()); - RefPtr event( - new ProgressTracker::MediumHighRunnable(std::move(aEvent))); + RefPtr event( + new ProgressTracker::RenderBlockingRunnable(std::move(aEvent))); return event.forget(); } @@ -200,7 +200,7 @@ void ProgressTracker::Notify(IProgressObserver* aObserver) { mRunnable->AddObserver(aObserver); } else { RefPtr ev = new AsyncNotifyRunnable(this, aObserver); - mRunnable = ProgressTracker::MediumHighRunnable::Create(ev.forget()); + mRunnable = ProgressTracker::RenderBlockingRunnable::Create(ev.forget()); mEventTarget->Dispatch(mRunnable, NS_DISPATCH_NORMAL); } } diff --git a/image/ProgressTracker.h b/image/ProgressTracker.h index d915b2aed6ad..4c9b9b3e578c 100644 --- a/image/ProgressTracker.h +++ b/image/ProgressTracker.h @@ -209,20 +209,21 @@ class ProgressTracker : public mozilla::SupportsWeakPtr { // Wrapper for AsyncNotifyRunnable to make it have medium high priority like // other imagelib runnables. - class MediumHighRunnable final : public PrioritizableRunnable { - explicit MediumHighRunnable(already_AddRefed&& aEvent); - virtual ~MediumHighRunnable() = default; + class RenderBlockingRunnable final : public PrioritizableRunnable { + explicit RenderBlockingRunnable( + already_AddRefed&& aEvent); + virtual ~RenderBlockingRunnable() = default; public: void AddObserver(IProgressObserver* aObserver); void RemoveObserver(IProgressObserver* aObserver); - static already_AddRefed Create( + static already_AddRefed Create( already_AddRefed&& aEvent); }; // The runnable, if any, that we've scheduled to deliver async notifications. - RefPtr mRunnable; + RefPtr mRunnable; // mMutex protects access to mImage and mEventTarget. mutable Mutex mMutex; diff --git a/image/VectorImage.cpp b/image/VectorImage.cpp index 129bd85ed014..3167f47f729e 100644 --- a/image/VectorImage.cpp +++ b/image/VectorImage.cpp @@ -1141,7 +1141,7 @@ void VectorImage::SendFrameComplete(bool aDidCache, uint32_t aFlags) { GetMaxSizedIntRect()); } else { NotNull> image = WrapNotNull(this); - NS_DispatchToMainThread(CreateMediumHighRunnable(NS_NewRunnableFunction( + NS_DispatchToMainThread(CreateRenderBlockingRunnable(NS_NewRunnableFunction( "ProgressTracker::SyncNotifyProgress", [=]() -> void { RefPtr tracker = image->GetProgressTracker(); if (tracker) { @@ -1504,7 +1504,7 @@ void VectorImage::InvalidateObserversOnNextRefreshDriverTick() { nsCOMPtr ev(NS_NewRunnableFunction( "VectorImage::SendInvalidationNotifications", [=]() -> void { self->SendInvalidationNotifications(); })); - eventTarget->Dispatch(CreateMediumHighRunnable(ev.forget()), + eventTarget->Dispatch(CreateRenderBlockingRunnable(ev.forget()), NS_DISPATCH_NORMAL); } diff --git a/image/imgRequest.cpp b/image/imgRequest.cpp index c5ae04b26bea..301ee4a95444 100644 --- a/image/imgRequest.cpp +++ b/image/imgRequest.cpp @@ -1001,7 +1001,7 @@ imgRequest::OnDataAvailable(nsIRequest* aRequest, nsIInputStream* aInStr, } else { nsCOMPtr runnable = new FinishPreparingForNewPartRunnable(this, std::move(result)); - eventTarget->Dispatch(CreateMediumHighRunnable(runnable.forget()), + eventTarget->Dispatch(CreateRenderBlockingRunnable(runnable.forget()), NS_DISPATCH_NORMAL); } } diff --git a/image/imgRequestProxy.cpp b/image/imgRequestProxy.cpp index 81a88c1c5ee8..0d7776082ceb 100644 --- a/image/imgRequestProxy.cpp +++ b/image/imgRequestProxy.cpp @@ -265,12 +265,13 @@ nsresult imgRequestProxy::DispatchWithTargetIfAvailable( // rather we need to (e.g. we are in the wrong scheduler group context). // As such, we do not set mHadDispatch for telemetry purposes. if (mEventTarget) { - mEventTarget->Dispatch(CreateMediumHighRunnable(std::move(aEvent)), + mEventTarget->Dispatch(CreateRenderBlockingRunnable(std::move(aEvent)), NS_DISPATCH_NORMAL); return NS_OK; } - return NS_DispatchToMainThread(CreateMediumHighRunnable(std::move(aEvent))); + return NS_DispatchToMainThread( + CreateRenderBlockingRunnable(std::move(aEvent))); } void imgRequestProxy::AddToOwner(Document* aLoadingDocument) { diff --git a/xpcom/threads/nsThreadUtils.cpp b/xpcom/threads/nsThreadUtils.cpp index a12ae3148d5a..dc6f49d51c44 100644 --- a/xpcom/threads/nsThreadUtils.cpp +++ b/xpcom/threads/nsThreadUtils.cpp @@ -138,10 +138,10 @@ PrioritizableRunnable::GetPriority(uint32_t* aPriority) { return NS_OK; } -already_AddRefed mozilla::CreateMediumHighRunnable( +already_AddRefed mozilla::CreateRenderBlockingRunnable( already_AddRefed&& aRunnable) { nsCOMPtr runnable = new PrioritizableRunnable( - std::move(aRunnable), nsIRunnablePriority::PRIORITY_MEDIUMHIGH); + std::move(aRunnable), nsIRunnablePriority::PRIORITY_RENDER_BLOCKING); return runnable.forget(); } diff --git a/xpcom/threads/nsThreadUtils.h b/xpcom/threads/nsThreadUtils.h index b48c07bdb967..96ed9a1df000 100644 --- a/xpcom/threads/nsThreadUtils.h +++ b/xpcom/threads/nsThreadUtils.h @@ -510,7 +510,7 @@ class PrioritizableRunnable : public Runnable, public nsIRunnablePriority { uint32_t mPriority; }; -extern already_AddRefed CreateMediumHighRunnable( +extern already_AddRefed CreateRenderBlockingRunnable( already_AddRefed&& aRunnable); namespace detail {