diff --git a/libpurgeablemem/cpp/include/purgeable_resource_manager.h b/libpurgeablemem/cpp/include/purgeable_resource_manager.h index c84aab13653b45e63514f526d1c7553a63fb56f6..88a45d235b77272d826369939c3517c0072c9bf8 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 4790342d8f9551867d7863dade7994ae4eeb39a8..1daf7c604e1e0cfe03711b773923a36de2aa4444 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 3a357e067e746f88b4bc072415c7ddfe4b666a55..7ea243f06d25772b79cecfa2da2448d2e43e5901 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 0230f1f6a063cb741f8896666387360b739be251..b167d770439bc9926661632162e9dcdfc16584c3 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()) {