From 38b50d24d61659fddc683267d9db721d8379d6e5 Mon Sep 17 00:00:00 2001 From: wonghiu45 Date: Thu, 13 Jul 2023 13:53:08 +0800 Subject: [PATCH] reuse threadpool when making purgeable pixelmap category:bugfix issue:https://gitee.com/openharmony/commonlibrary_memory_utils/issues/I7KVG6 Signed-off-by: wonghiu45 Change-Id: If22bb2890e5e84334350ae6350b7921ee8878e1c --- .../cpp/include/purgeable_resource_manager.h | 1 + .../cpp/src/purgeable_resource_manager.cpp | 9 ++++ .../include/purgeable_pixelmap_builder.h | 12 +++-- .../src/purgeable_pixelmap_builder.cpp | 49 +++++++++++++++++-- 4 files changed, 64 insertions(+), 7 deletions(-) diff --git a/libpurgeablemem/cpp/include/purgeable_resource_manager.h b/libpurgeablemem/cpp/include/purgeable_resource_manager.h index c84aab1..88a45d2 100644 --- a/libpurgeablemem/cpp/include/purgeable_resource_manager.h +++ b/libpurgeablemem/cpp/include/purgeable_resource_manager.h @@ -93,6 +93,7 @@ public: void RemoveResource(std::shared_ptr resourcePtr); void SetRecentUsedResource(std::shared_ptr resourcePtr); void SetLruCacheCapacity(int32_t capacity); + void AddTaskToThreadPool(const std::function &f); void Clear(); void RemoveLastResource(); void ShowLruCache() const; diff --git a/libpurgeablemem/cpp/src/purgeable_resource_manager.cpp b/libpurgeablemem/cpp/src/purgeable_resource_manager.cpp index 4790342..1daf7c6 100644 --- a/libpurgeablemem/cpp/src/purgeable_resource_manager.cpp +++ b/libpurgeablemem/cpp/src/purgeable_resource_manager.cpp @@ -309,5 +309,14 @@ void PurgeableResourceManager::StartThreadPool() isThreadPoolStarted_ = true; PM_HILOG_DEBUG(LOG_CORE, "StartThreadPool finish."); } + +void PurgeableResourceManager::AddTaskToThreadPool(const std::function &f) +{ + if (!isThreadPoolStarted_) { + StartThreadPool(); + } + + threadPool_.AddTask(f); +} } /* namespace PurgeableMem */ } /* namespace OHOS */ \ No newline at end of file diff --git a/purgeable_builder/include/purgeable_pixelmap_builder.h b/purgeable_builder/include/purgeable_pixelmap_builder.h index 3a357e0..7ea243f 100644 --- a/purgeable_builder/include/purgeable_pixelmap_builder.h +++ b/purgeable_builder/include/purgeable_pixelmap_builder.h @@ -46,12 +46,18 @@ private: }; // class PurgeablePixelMapBuilder bool GetSysForPurgeable(); -void SetBuilderToBePurgeable(std::unique_ptr &pixelMap, +void SetBuilderToBePurgeable(PixelMap *pixelMap, std::unique_ptr &builder); -void RemoveFromPurgeableResourceMgr(std::shared_ptr &pixelMap); -void AddToPurgeableResourceMgr(std::unique_ptr &pixelMap); +void RemoveFromPurgeableResourceMgr(PixelMap *pixelMap); +void AddToPurgeableResourceMgr(PixelMap *pixelMap); bool MakePixelMapToBePurgeable(std::unique_ptr &pixelMap, std::unique_ptr &backupImgSrc4Rebuild, DecodeOptions &decodeOpts); +bool MakePixelMapToBePurgeable(std::unique_ptr &pixelMap, const int fd, + const SourceOptions &opts, DecodeOptions &decodeOpts); +bool MakePixelMapToBePurgeableBySrc(PixelMap *pixelMap, + std::unique_ptr &backupImgSrc4Rebuild, DecodeOptions &decodeOpts); +bool MakePixelMapToBePurgeableByFd(PixelMap *pixelMap, const int fd, const SourceOptions &opts, + DecodeOptions &decodeOpts); bool IfCanBePurgeable(DecodeOptions &decodeOpts); } // namespace PurgeableBuilder } // namespace OHOS diff --git a/purgeable_builder/src/purgeable_pixelmap_builder.cpp b/purgeable_builder/src/purgeable_pixelmap_builder.cpp index 0230f1f..b167d77 100644 --- a/purgeable_builder/src/purgeable_pixelmap_builder.cpp +++ b/purgeable_builder/src/purgeable_pixelmap_builder.cpp @@ -17,6 +17,7 @@ #include "hitrace_meter.h" #include "hilog/log.h" +#include "media_errors.h" #include "parameters.h" #include "purgeable_ashmem.h" #include "purgeable_mem_base.h" @@ -74,12 +75,17 @@ bool GetSysForPurgeable() return system::GetBoolParameter(SYSTEM_PARAM_PURGEABLE_ENABLE, false); } -void SetBuilderToBePurgeable(std::unique_ptr &pixelMap, +void SetBuilderToBePurgeable(PixelMap *pixelMap, std::unique_ptr &builder) { HiviewDFX::HiLog::Debug(LABEL, "set builder for purgeable pixelmap. allocatorType = %{public}d.", pixelMap->GetAllocatorType()); StartTrace(HITRACE_TAG_ZIMAGE, "OHOS::PurgeableBuilder::SetBuilderToBePurgeable"); + if (pixelMap == nullptr) { + FinishTrace(HITRACE_TAG_ZIMAGE); + return; + } + if (builder == nullptr) { FinishTrace(HITRACE_TAG_ZIMAGE); return; @@ -101,11 +107,16 @@ void SetBuilderToBePurgeable(std::unique_ptr &pixelMap, FinishTrace(HITRACE_TAG_ZIMAGE); } -void RemoveFromPurgeableResourceMgr(std::shared_ptr &pixelMap) +void RemoveFromPurgeableResourceMgr(PixelMap *pixelMap) { StartTrace(HITRACE_TAG_ZIMAGE, "OHOS::PurgeableBuilder::RemoveFromPurgeableResourceMgr"); HiviewDFX::HiLog::Debug(LABEL, "remove pixelmap from PurgeableResourceMgr."); + if (pixelMap == nullptr) { + FinishTrace(HITRACE_TAG_ZIMAGE); + return; + } + if (pixelMap->IsPurgeable()) { PurgeableMem::PurgeableResourceManager::GetInstance().RemoveResource(pixelMap->GetPurgeableMemPtr()); } @@ -113,11 +124,16 @@ void RemoveFromPurgeableResourceMgr(std::shared_ptr &pixelMap) FinishTrace(HITRACE_TAG_ZIMAGE); } -void AddToPurgeableResourceMgr(std::unique_ptr &pixelMap) +void AddToPurgeableResourceMgr(PixelMap *pixelMap) { StartTrace(HITRACE_TAG_ZIMAGE, "OHOS::PurgeableBuilder::AddToPurgeableResourceMgr"); HiviewDFX::HiLog::Debug(LABEL, "add pixelmap purgeablemem ptr to PurgeableResourceMgr"); + if (pixelMap == nullptr) { + FinishTrace(HITRACE_TAG_ZIMAGE); + return; + } + if (pixelMap->IsPurgeable()) { PurgeableMem::PurgeableResourceManager::GetInstance().AddResource(pixelMap->GetPurgeableMemPtr()); } @@ -139,6 +155,31 @@ bool IfCanBePurgeable(DecodeOptions &decodeOpts) bool MakePixelMapToBePurgeable(std::unique_ptr &pixelMap, std::unique_ptr &backupImgSrc4Rebuild, DecodeOptions &decodeOpts) +{ + return MakePixelMapToBePurgeableBySrc(pixelMap.get(), backupImgSrc4Rebuild, decodeOpts); +} + +bool MakePixelMapToBePurgeable(std::unique_ptr &pixelMap, const int fd, + const SourceOptions &opts, DecodeOptions &decodeOpts) +{ + auto task = std::bind(MakePixelMapToBePurgeableByFd, pixelMap.get(), fd, opts, decodeOpts); + PurgeableMem::PurgeableResourceManager::GetInstance().AddTaskToThreadPool(task); + return true; +} + +bool MakePixelMapToBePurgeableByFd(PixelMap *pixelMap, const int fd, const SourceOptions &opts, + DecodeOptions &decodeOpts) +{ + uint32_t errorCode = 0; + std::unique_ptr backupImgSrc = ImageSource::CreateImageSource(fd, opts, errorCode); + if (errorCode != Media::SUCCESS) { + return false; + } + return MakePixelMapToBePurgeableBySrc(pixelMap, backupImgSrc, decodeOpts); +} + +bool MakePixelMapToBePurgeableBySrc(PixelMap *pixelMap, + std::unique_ptr &backupImgSrc4Rebuild, DecodeOptions &decodeOpts) { StartTrace(HITRACE_TAG_ZIMAGE, "OHOS::PurgeableBuilder::MakePixelMapToBePurgeable"); HiviewDFX::HiLog::Debug(LABEL, "MakePixelMapToBePurgeable in."); @@ -166,7 +207,7 @@ bool MakePixelMapToBePurgeable(std::unique_ptr &pixelMap, std::unique_ } std::unique_ptr purgeableMemBuilder = - std::make_unique(0, backupImgSrc4Rebuild, decodeOpts, pixelMap.get()); + std::make_unique(0, backupImgSrc4Rebuild, decodeOpts, pixelMap); SetBuilderToBePurgeable(pixelMap, purgeableMemBuilder); if (pixelMap->IsPurgeable()) { -- Gitee