/* static */ void IDecodingTask::NotifyProgress(NotNull<RasterImage*> aImage, NotNull<Decoder*> aDecoder) { MOZ_ASSERT(aDecoder->HasProgress() && !aDecoder->IsMetadataDecode()); // Capture the decoder's state. If we need to notify asynchronously, it's // important that we don't wait until the lambda actually runs to capture the // state that we're going to notify. That would both introduce data races on // the decoder's state and cause inconsistencies between the NotifyProgress() // calls we make off-main-thread and the notifications that RasterImage // actually receives, which would cause bugs. Progress progress = aDecoder->TakeProgress(); IntRect invalidRect = aDecoder->TakeInvalidRect(); Maybe<uint32_t> frameCount = aDecoder->TakeCompleteFrameCount(); SurfaceFlags surfaceFlags = aDecoder->GetSurfaceFlags(); // Synchronously notify if we can. if (NS_IsMainThread() && !(aDecoder->GetDecoderFlags() & DecoderFlags::ASYNC_NOTIFY)) { aImage->NotifyProgress(progress, invalidRect, frameCount, surfaceFlags); return; } // We're forced to notify asynchronously. NotNull<RefPtr<RasterImage>> image = aImage; NS_DispatchToMainThread(NS_NewRunnableFunction([=]() -> void { image->NotifyProgress(progress, invalidRect, frameCount, surfaceFlags); })); }
static void NotifyProgress(NotNull<Decoder*> aDecoder) { MOZ_ASSERT(aDecoder->HasProgress() && !aDecoder->IsMetadataDecode()); Progress progress = aDecoder->TakeProgress(); IntRect invalidRect = aDecoder->TakeInvalidRect(); Maybe<uint32_t> frameCount = aDecoder->TakeCompleteFrameCount(); SurfaceFlags surfaceFlags = aDecoder->GetSurfaceFlags(); // Synchronously notify if we can. if (NS_IsMainThread() && !(aDecoder->GetDecoderFlags() & DecoderFlags::ASYNC_NOTIFY)) { aDecoder->GetImage()->NotifyProgress(progress, invalidRect, frameCount, surfaceFlags); return; } // We're forced to notify asynchronously. NotNull<RefPtr<Decoder>> decoder = aDecoder; NS_DispatchToMainThread(NS_NewRunnableFunction([=]() -> void { decoder->GetImage()->NotifyProgress(progress, invalidRect, frameCount, surfaceFlags); })); }
/* static */ void IDecodingTask::NotifyProgress(NotNull<Decoder*> aDecoder) { MOZ_ASSERT(aDecoder->HasProgress() && !aDecoder->IsMetadataDecode()); // Synchronously notify if we can. if (NS_IsMainThread() && !(aDecoder->GetDecoderFlags() & DecoderFlags::ASYNC_NOTIFY)) { aDecoder->GetImage()->NotifyProgress(aDecoder->TakeProgress(), aDecoder->TakeInvalidRect(), aDecoder->GetSurfaceFlags()); return; } // We're forced to notify asynchronously. NotNull<RefPtr<Decoder>> decoder = aDecoder; NS_DispatchToMainThread(NS_NewRunnableFunction([=]() -> void { decoder->GetImage()->NotifyProgress(decoder->TakeProgress(), decoder->TakeInvalidRect(), decoder->GetSurfaceFlags()); })); }