From ffec1b7e12a3f356061ec4cb69b35fcb67c76e62 Mon Sep 17 00:00:00 2001 From: lushi Date: Thu, 14 Oct 2021 10:47:08 +0800 Subject: [PATCH] use weak ptr of io manager on io thread Signed-off-by: lushi Change-Id: I46b513860241ee9aa5177ba8d0940956b93b42b6 --- .../engine/functions/js_function.h | 2 +- .../core/image/animated_image_player.cpp | 1 + frameworks/core/image/animated_image_player.h | 3 + frameworks/core/image/image_provider.cpp | 55 +++++++++---------- frameworks/core/image/image_provider.h | 6 +- 5 files changed, 33 insertions(+), 34 deletions(-) diff --git a/frameworks/bridge/declarative_frontend/engine/functions/js_function.h b/frameworks/bridge/declarative_frontend/engine/functions/js_function.h index bc2399d426f..9da68727118 100644 --- a/frameworks/bridge/declarative_frontend/engine/functions/js_function.h +++ b/frameworks/bridge/declarative_frontend/engine/functions/js_function.h @@ -40,7 +40,7 @@ protected: public: JsFunction(const JSRef& jsObject, const JSRef& jsFunction); - ~JsFunction(); + virtual ~JsFunction(); }; template diff --git a/frameworks/core/image/animated_image_player.cpp b/frameworks/core/image/animated_image_player.cpp index adcb2244c63..f7c1f1b46f8 100644 --- a/frameworks/core/image/animated_image_player.cpp +++ b/frameworks/core/image/animated_image_player.cpp @@ -110,6 +110,7 @@ sk_sp AnimatedImagePlayer::DecodeFrameImage(const int32_t& index) iterator->second = std::make_unique(bitmap); } #ifndef GPU_DISABLED + // weak reference of io manager must be check and used on io thread, because io manager is created on io thread. if (ioManager_) { auto resourceContext = ioManager_->GetResourceContext(); if (resourceContext) { diff --git a/frameworks/core/image/animated_image_player.h b/frameworks/core/image/animated_image_player.h index a0133c31e86..5835eaaf194 100644 --- a/frameworks/core/image/animated_image_player.h +++ b/frameworks/core/image/animated_image_player.h @@ -117,7 +117,10 @@ private: ImageSourceInfo imageSource_; UploadSuccessCallback successCallback_; WeakPtr context_; + + // weak reference of io manager must be check and used on io thread, because io manager is created on io thread. fml::WeakPtr ioManager_; + fml::RefPtr unrefQueue_; const std::unique_ptr codec_; const int32_t frameCount_; diff --git a/frameworks/core/image/image_provider.cpp b/frameworks/core/image/image_provider.cpp index 9c63000eb19..b4a5a57f257 100644 --- a/frameworks/core/image/image_provider.cpp +++ b/frameworks/core/image/image_provider.cpp @@ -260,36 +260,33 @@ void ImageProvider::UploadImageToGPUForRender( callback({ image, renderTaskHolder->unrefQueue }); return; } - if (renderTaskHolder->IsValid()) { - auto task = [rasterizedImage, callback, renderTaskHolder] () { - if (!renderTaskHolder->ioManager) { - // Shell is closing. - callback({ rasterizedImage, renderTaskHolder->unrefQueue }); - return; - } - ACE_DCHECK(!rasterizedImage->isTextureBacked()); - auto resContext = renderTaskHolder->ioManager->GetResourceContext(); - if (!resContext) { - callback({ rasterizedImage, renderTaskHolder->unrefQueue }); - return; - } - SkPixmap pixmap; - if (!rasterizedImage->peekPixels(&pixmap)) { - LOGW("Could not peek pixels of image for texture upload."); - callback({ rasterizedImage, renderTaskHolder->unrefQueue }); - return; - } - auto textureImage = - SkImage::MakeCrossContextFromPixmap(resContext.get(), pixmap, true, pixmap.colorSpace(), true); - callback({ textureImage ? textureImage : rasterizedImage, renderTaskHolder->unrefQueue }); + auto task = [rasterizedImage, callback, renderTaskHolder] () { + // weak reference of io manager must be check and used on io thread, because io manager is created on io thread. + if (!renderTaskHolder->ioManager) { + // Shell is closing. + callback({ rasterizedImage, renderTaskHolder->unrefQueue }); + return; + } + ACE_DCHECK(!rasterizedImage->isTextureBacked()); + auto resContext = renderTaskHolder->ioManager->GetResourceContext(); + if (!resContext) { + callback({ rasterizedImage, renderTaskHolder->unrefQueue }); + return; + } + SkPixmap pixmap; + if (!rasterizedImage->peekPixels(&pixmap)) { + LOGW("Could not peek pixels of image for texture upload."); + callback({ rasterizedImage, renderTaskHolder->unrefQueue }); + return; + } + auto textureImage = + SkImage::MakeCrossContextFromPixmap(resContext.get(), pixmap, true, pixmap.colorSpace(), true); + callback({ textureImage ? textureImage : rasterizedImage, renderTaskHolder->unrefQueue }); - // Trigger purge cpu bitmap resource, after image upload to gpu. - SkGraphics::PurgeResourceCache(); - }; - renderTaskHolder->ioTaskRunner->PostTask(std::move(task)); - } else { - callback({ rasterizedImage, renderTaskHolder->unrefQueue }); - } + // Trigger purge cpu bitmap resource, after image upload to gpu. + SkGraphics::PurgeResourceCache(); + }; + renderTaskHolder->ioTaskRunner->PostTask(std::move(task)); #endif } diff --git a/frameworks/core/image/image_provider.h b/frameworks/core/image/image_provider.h index 9a9a6b09c4b..0e764e9e873 100644 --- a/frameworks/core/image/image_provider.h +++ b/frameworks/core/image/image_provider.h @@ -44,11 +44,9 @@ public: ioManager(manager), ioTaskRunner(taskRunner) {} - bool IsValid() - { - return ioManager && ioManager->GetResourceContext() && ioTaskRunner; - } + fml::RefPtr unrefQueue; + // weak reference of io manager must be check and used on io thread, because io manager is created on io thread. fml::WeakPtr ioManager; fml::RefPtr ioTaskRunner; }; -- Gitee