diff --git a/frameworks/bridge/declarative_frontend/engine/functions/js_function.h b/frameworks/bridge/declarative_frontend/engine/functions/js_function.h index bc2399d426f4bed8e2d5ea04e83bd5bb28e7a571..9da6872711806ca8fe181962a775de0449c31a59 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 adcb2244c6370d6c6fa34b8fb6325a95e9a80150..f7c1f1b46f880a16d558c5b8d3727c5e5404abce 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 a0133c31e86d1e26bf4c0940aef299d07b582bfb..5835eaaf194df17b26a28b43dd6b994fde37b275 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 9c63000eb193c918fb2ce1149baca4272f786a0f..b4a5a57f2570c6d83cc66714b12c4c27ad390fc0 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 9a9a6b09c4bfa78c24922636675192e9b078c9ab..0e764e9e8731a325f4c808fa05a0c87417e1c8f1 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; };