From 4cd6dd5c3731a912d8b218d996f1a89dfb0e5982 Mon Sep 17 00:00:00 2001 From: Seth Fowler Date: Wed, 15 Oct 2014 13:52:22 -0700 Subject: [PATCH] Bug 1079653 (Part 4) - Move the recording imgStatusTracker onto RasterImage. r=tn --HG-- extra : rebase_source : ee06a99abfaf5c2a6f53f562088ceb453bfe2259 --- image/src/RasterImage.cpp | 55 ++++++++++++++++++++------------------- image/src/RasterImage.h | 35 +++++++++++-------------- 2 files changed, 43 insertions(+), 47 deletions(-) diff --git a/image/src/RasterImage.cpp b/image/src/RasterImage.cpp index 6a580a434334..b0db5c4682b7 100644 --- a/image/src/RasterImage.cpp +++ b/image/src/RasterImage.cpp @@ -1767,6 +1767,7 @@ RasterImage::OnNewSourceData() mHasSize = false; mWantFullDecode = true; mDecodeRequest = nullptr; + mDecodeStatusTracker = nullptr; if (mAnim) { mAnim->SetDoneDecoding(false); @@ -1868,6 +1869,7 @@ RasterImage::Discard(bool force) mStatusTracker->OnDiscard(); mDecodeRequest = nullptr; + mDecodeStatusTracker = nullptr; if (force) DiscardTracker::Remove(&mDiscardTrackerNode); @@ -1988,11 +1990,14 @@ RasterImage::InitDecoder(bool aDoSizeDecode) // Initialize the decoder if (!mDecodeRequest) { - mDecodeRequest = new DecodeRequest(this); + mDecodeRequest = new DecodeRequest(); } - MOZ_ASSERT(mDecodeRequest->mStatusTracker); - MOZ_ASSERT(mDecodeRequest->mStatusTracker->GetDecoderObserver()); - mDecoder->SetObserver(mDecodeRequest->mStatusTracker->GetDecoderObserver()); + if (!mDecodeStatusTracker) { + MOZ_ASSERT(mStatusTracker, "Should have an imgStatusTracker"); + mDecodeStatusTracker = mStatusTracker->CloneForRecording(); + } + MOZ_ASSERT(mDecodeStatusTracker->GetDecoderObserver()); + mDecoder->SetObserver(mDecodeStatusTracker->GetDecoderObserver()); mDecoder->SetSizeDecode(aDoSizeDecode); mDecoder->SetDecodeFlags(mFrameDecodeFlags); if (!aDoSizeDecode) { @@ -2978,18 +2983,15 @@ RasterImage::RequestDecodeIfNeeded(nsresult aStatus, nsresult RasterImage::FinishedSomeDecoding(eShutdownIntent aIntent /* = eShutdownIntent_Done */, - DecodeRequest* aRequest /* = nullptr */) + imgStatusTracker* aDecodeTracker /* = nullptr */) { MOZ_ASSERT(NS_IsMainThread()); mDecodingMonitor.AssertCurrentThreadIn(); - nsRefPtr request; - if (aRequest) { - request = aRequest; - } else { - request = mDecodeRequest; - } + nsRefPtr statusTracker = aDecodeTracker + ? aDecodeTracker + : mDecodeStatusTracker.get(); // Ensure that, if the decoder is the last reference to the image, we don't // destroy it by destroying the decoder. @@ -3020,7 +3022,7 @@ RasterImage::FinishedSomeDecoding(eShutdownIntent aIntent /* = eShutdownIntent_D wasSize = decoder->IsSizeDecode(); // Do some telemetry if this isn't a size decode. - if (request && !wasSize) { + if (!wasSize) { Telemetry::Accumulate(Telemetry::IMAGE_DECODE_TIME, int32_t(decoder->DecodeTime().ToMicroseconds())); @@ -3043,9 +3045,9 @@ RasterImage::FinishedSomeDecoding(eShutdownIntent aIntent /* = eShutdownIntent_D } } - ImageStatusDiff diff = - request ? image->mStatusTracker->Difference(request->mStatusTracker) - : image->mStatusTracker->DecodeStateAsDifference(); + ImageStatusDiff diff = statusTracker + ? image->mStatusTracker->Difference(statusTracker) + : image->mStatusTracker->DecodeStateAsDifference(); image->mStatusTracker->ApplyDifference(diff); if (mNotifying) { @@ -3273,13 +3275,15 @@ RasterImage::DecodePool::DecodeJob::Run() // If we were interrupted, we shouldn't do any work. if (mRequest->mRequestStatus == DecodeRequest::REQUEST_STOPPED) { - DecodeDoneWorker::NotifyFinishedSomeDecoding(mImage, mRequest); + DecodeDoneWorker::NotifyFinishedSomeDecoding(mImage, + mImage->mDecodeStatusTracker); return NS_OK; } // If someone came along and synchronously decoded us, there's nothing for us to do. if (!mImage->mDecoder || mImage->IsDecodeFinished()) { - DecodeDoneWorker::NotifyFinishedSomeDecoding(mImage, mRequest); + DecodeDoneWorker::NotifyFinishedSomeDecoding(mImage, + mImage->mDecodeStatusTracker); return NS_OK; } @@ -3327,7 +3331,8 @@ RasterImage::DecodePool::DecodeJob::Run() DecodePool::Singleton()->RequestDecode(mImage); } else { // Nothing more for us to do - let everyone know what happened. - DecodeDoneWorker::NotifyFinishedSomeDecoding(mImage, mRequest); + DecodeDoneWorker::NotifyFinishedSomeDecoding(mImage, + mImage->mDecodeStatusTracker); } return NS_OK; @@ -3498,17 +3503,13 @@ RasterImage::DecodePool::DecodeSomeOfImage(RasterImage* aImg, return NS_OK; } -RasterImage::DecodeDoneWorker::DecodeDoneWorker(RasterImage* image, DecodeRequest* request) - : mImage(image) - , mRequest(request) -{} - void -RasterImage::DecodeDoneWorker::NotifyFinishedSomeDecoding(RasterImage* image, DecodeRequest* request) +RasterImage::DecodeDoneWorker::NotifyFinishedSomeDecoding(RasterImage* aImage, + imgStatusTracker* aTracker) { - image->mDecodingMonitor.AssertCurrentThreadIn(); + aImage->mDecodingMonitor.AssertCurrentThreadIn(); - nsCOMPtr worker = new DecodeDoneWorker(image, request); + nsCOMPtr worker = new DecodeDoneWorker(aImage, aTracker); NS_DispatchToMainThread(worker); } @@ -3518,7 +3519,7 @@ RasterImage::DecodeDoneWorker::Run() MOZ_ASSERT(NS_IsMainThread()); ReentrantMonitorAutoEnter lock(mImage->mDecodingMonitor); - mImage->FinishedSomeDecoding(eShutdownIntent_Done, mRequest); + mImage->FinishedSomeDecoding(eShutdownIntent_Done, mTracker); return NS_OK; } diff --git a/image/src/RasterImage.h b/image/src/RasterImage.h index c1232e3e6671..0ccd4d7b4f12 100644 --- a/image/src/RasterImage.h +++ b/image/src/RasterImage.h @@ -313,8 +313,8 @@ private: { mDecodingMonitor.AssertCurrentThreadIn(); nsRefPtr statusTracker; - statusTracker = mDecodeRequest ? mDecodeRequest->mStatusTracker - : mStatusTracker; + statusTracker = mDecodeStatusTracker ? mDecodeStatusTracker + : mStatusTracker; MOZ_ASSERT(statusTracker); return statusTracker.forget(); } @@ -327,22 +327,12 @@ private: */ struct DecodeRequest { - explicit DecodeRequest(RasterImage* aImage) - : mImage(aImage) - , mRequestStatus(REQUEST_INACTIVE) - { - MOZ_ASSERT(aImage, "aImage cannot be null"); - MOZ_ASSERT(aImage->mStatusTracker, - "aImage should have an imgStatusTracker"); - mStatusTracker = aImage->mStatusTracker->CloneForRecording(); - } + explicit DecodeRequest() + : mRequestStatus(REQUEST_INACTIVE) + { } NS_INLINE_DECL_THREADSAFE_REFCOUNTING(DecodeRequest) - // The status tracker that is associated with a given decode request, to - // ensure their lifetimes are linked. - nsRefPtr mStatusTracker; - RasterImage* mImage; enum DecodeRequestStatus @@ -479,17 +469,21 @@ private: * Ensures the decode state accumulated by the decoding process gets * applied to the image. */ - static void NotifyFinishedSomeDecoding(RasterImage* image, DecodeRequest* request); + static void NotifyFinishedSomeDecoding(RasterImage* aImage, + imgStatusTracker* aTracker); NS_IMETHOD Run(); private: /* methods */ - DecodeDoneWorker(RasterImage* image, DecodeRequest* request); + DecodeDoneWorker(RasterImage* aImage, imgStatusTracker* aTracker) + : mImage(aImage) + , mTracker(aTracker) + { } private: /* members */ nsRefPtr mImage; - nsRefPtr mRequest; + nsRefPtr mTracker; }; class FrameNeededWorker : public nsRunnable @@ -514,8 +508,8 @@ private: nsRefPtr mImage; }; - nsresult FinishedSomeDecoding(eShutdownIntent intent = eShutdownIntent_Done, - DecodeRequest* request = nullptr); + nsresult FinishedSomeDecoding(eShutdownIntent aIntent = eShutdownIntent_Done, + imgStatusTracker* aDecodeTracker = nullptr); void DrawWithPreDownscaleIfNeeded(DrawableFrameRef&& aFrameRef, gfxContext* aContext, @@ -640,6 +634,7 @@ private: // data // Decoder and friends nsRefPtr mDecoder; nsRefPtr mDecodeRequest; + nsRefPtr mDecodeStatusTracker; bool mInDecoder; // END LOCKED MEMBER VARIABLES