From 0ed0e028366f189b9d98367ff7881a4024aae602 Mon Sep 17 00:00:00 2001 From: wonghiu45 Date: Wed, 9 Aug 2023 16:54:23 +0800 Subject: [PATCH] refactor datalock category: bugfix issue: https://gitee.com/openharmony/commonlibrary_memory_utils/issues/I7RUD9 Signed-off-by: wonghiu45 Change-Id: I53218fa11a9a2b45b50facd620d33581036091c4 --- .../cpp/include/purgeable_mem_base.h | 2 +- .../cpp/include/purgeable_resource_manager.h | 4 +- .../cpp/src/purgeable_resource_manager.cpp | 88 +++++++++++++------ .../src/purgeable_pixelmap_builder.cpp | 4 +- 4 files changed, 67 insertions(+), 31 deletions(-) diff --git a/libpurgeablemem/cpp/include/purgeable_mem_base.h b/libpurgeablemem/cpp/include/purgeable_mem_base.h index 0b6d7c9..e66727e 100644 --- a/libpurgeablemem/cpp/include/purgeable_mem_base.h +++ b/libpurgeablemem/cpp/include/purgeable_mem_base.h @@ -120,7 +120,7 @@ protected: virtual int GetPinStatus() const; virtual void AfterRebuildSucc(); virtual std::string ToString() const; - friend class PurgeableResourceManager::LruCache; + friend class PurgeableResourceManager; }; } /* namespace PurgeableMem */ } /* namespace OHOS */ diff --git a/libpurgeablemem/cpp/include/purgeable_resource_manager.h b/libpurgeablemem/cpp/include/purgeable_resource_manager.h index 41a3b35..9587ac1 100644 --- a/libpurgeablemem/cpp/include/purgeable_resource_manager.h +++ b/libpurgeablemem/cpp/include/purgeable_resource_manager.h @@ -51,6 +51,9 @@ private: int32_t GetThreadPoolTaskNumFromSysPara() const; int32_t GetLruCacheCapacityFromSysPara() const; void StartThreadPool(); + void ChangeDataValid(std::shared_ptr resourcePtr, bool isVaild) const; + void AddResourceInner(std::shared_ptr resourcePtr); + void RemoveResourceInner(std::shared_ptr resourcePtr); class LruCache { public: /* @@ -92,7 +95,6 @@ private: std::list> resourcePtrList_; std::unordered_map, ListSharedPtrIterator> positionMap_; }; - friend class PurgeableMemBase; mutable std::mutex lruCacheMutex_; mutable std::mutex threadPoolMutex_; diff --git a/libpurgeablemem/cpp/src/purgeable_resource_manager.cpp b/libpurgeablemem/cpp/src/purgeable_resource_manager.cpp index c67ce30..aefec6c 100644 --- a/libpurgeablemem/cpp/src/purgeable_resource_manager.cpp +++ b/libpurgeablemem/cpp/src/purgeable_resource_manager.cpp @@ -54,9 +54,6 @@ void PurgeableResourceManager::LruCache::Insert(std::shared_ptr dataLock(key->dataLock_); - key->SetDataValid(true); - auto resourcePtrIter = positionMap_.find(key); if (resourcePtrIter != positionMap_.end()) { resourcePtrList_.splice(resourcePtrList_.begin(), resourcePtrList_, resourcePtrIter->second); @@ -82,18 +79,11 @@ void PurgeableResourceManager::LruCache::Erase(std::shared_ptr return; } - std::lock_guard dataLock(key->dataLock_); - key->SetDataValid(false); - auto resourcePtrIter = positionMap_.find(key); if (resourcePtrIter == positionMap_.end()) { return; } - if (key->GetPinStatus() == 0) { - key->Pin(); - } - resourcePtrList_.erase(resourcePtrIter->second); positionMap_.erase(key); } @@ -161,11 +151,17 @@ PurgeableResourceManager &PurgeableResourceManager::GetInstance() void PurgeableResourceManager::BeginAccessPurgeableMem() { - std::lock_guard lock(lruCacheMutex_); - StartTrace(HITRACE_TAG_COMMONLIBRARY, "OHOS::PurgeableMem::PurgeableResourceManager::BeginAccessPurgeableMem"); + StartTrace(HITRACE_TAG_ZIMAGE, "OHOS::PurgeableMem::PurgeableResourceManager::BeginAccessPurgeableMem"); std::list> resourcePtrList = lruCache_.GetResourcePtrList(); if (resourcePtrList.size() == 0) { + FinishTrace(HITRACE_TAG_ZIMAGE); + return; + } + + std::lock_guard lock(lruCacheMutex_); + if (resourcePtrList.size() == 0) { + FinishTrace(HITRACE_TAG_ZIMAGE); return; } @@ -181,18 +177,24 @@ void PurgeableResourceManager::BeginAccessPurgeableMem() threadPool_.AddTask(task); } - FinishTrace(HITRACE_TAG_COMMONLIBRARY); + FinishTrace(HITRACE_TAG_ZIMAGE); PM_HILOG_DEBUG(LOG_CORE, "[PurgeableResourceManager] BeginAccessPurgeableMem list size: %{public}zu", lruCache_.Size()); } void PurgeableResourceManager::EndAccessPurgeableMem() { - std::lock_guard lock(lruCacheMutex_); - StartTrace(HITRACE_TAG_COMMONLIBRARY, "OHOS::PurgeableMem::PurgeableResourceManager::EndAccessPurgeableMem"); + StartTrace(HITRACE_TAG_ZIMAGE, "OHOS::PurgeableMem::PurgeableResourceManager::EndAccessPurgeableMem"); std::list> resourcePtrList = lruCache_.GetResourcePtrList(); if (resourcePtrList.size() == 0) { + FinishTrace(HITRACE_TAG_ZIMAGE); + return; + } + + std::lock_guard lock(lruCacheMutex_); + if (resourcePtrList.size() == 0) { + FinishTrace(HITRACE_TAG_ZIMAGE); return; } @@ -208,37 +210,71 @@ void PurgeableResourceManager::EndAccessPurgeableMem() threadPool_.AddTask(task); } - FinishTrace(HITRACE_TAG_COMMONLIBRARY); + FinishTrace(HITRACE_TAG_ZIMAGE); PM_HILOG_DEBUG(LOG_CORE, "[PurgeableResourceManager] EndAccessPurgeableMem list size: %{public}zu", lruCache_.Size()); } +void PurgeableResourceManager::ChangeDataValid(std::shared_ptr resourcePtr, bool isVaild) const +{ + StartTrace(HITRACE_TAG_ZIMAGE, "OHOS::PurgeableMem::PurgeableResourceManager::ChangeDataValid"); + std::lock_guard dataLock(resourcePtr->dataLock_); + resourcePtr->SetDataValid(isVaild); + if (!isVaild && resourcePtr->GetPinStatus() == 0) { + resourcePtr->Pin(); + } + FinishTrace(HITRACE_TAG_ZIMAGE); +} + void PurgeableResourceManager::AddResource(std::shared_ptr resourcePtr) { + auto task = [this, resourcePtr] () { + if (resourcePtr == nullptr) { + return; + } + AddResourceInner(resourcePtr); + }; + AddTaskToThreadPool(task); +} + +void PurgeableResourceManager::AddResourceInner(std::shared_ptr resourcePtr) +{ + StartTrace(HITRACE_TAG_ZIMAGE, "OHOS::PurgeableMem::PurgeableResourceManager::AddResource"); std::lock_guard lock(lruCacheMutex_); - StartTrace(HITRACE_TAG_COMMONLIBRARY, "OHOS::PurgeableMem::PurgeableResourceManager::AddResource"); if (resourcePtr == nullptr) { - FinishTrace(HITRACE_TAG_COMMONLIBRARY); + FinishTrace(HITRACE_TAG_ZIMAGE); return; } lruCache_.Insert(resourcePtr); - FinishTrace(HITRACE_TAG_COMMONLIBRARY); + FinishTrace(HITRACE_TAG_ZIMAGE); PM_HILOG_DEBUG(LOG_CORE, "[PurgeableResourceManager] AddResource resourcePtr: 0x%{public}lx, " "list size: %{public}zu", (long)resourcePtr.get(), lruCache_.Size()); } void PurgeableResourceManager::RemoveResource(std::shared_ptr resourcePtr) { + ChangeDataValid(resourcePtr, false); + auto task = [this, resourcePtr] () { + if (resourcePtr == nullptr) { + return; + } + RemoveResourceInner(resourcePtr); + }; + AddTaskToThreadPool(task); +} + +void PurgeableResourceManager::RemoveResourceInner(std::shared_ptr resourcePtr) +{ + StartTrace(HITRACE_TAG_ZIMAGE, "OHOS::PurgeableMem::PurgeableResourceManager::RemoveResource"); std::lock_guard lock(lruCacheMutex_); - StartTrace(HITRACE_TAG_COMMONLIBRARY, "OHOS::PurgeableMem::PurgeableResourceManager::RemoveResource"); if (resourcePtr == nullptr) { - FinishTrace(HITRACE_TAG_COMMONLIBRARY); + FinishTrace(HITRACE_TAG_ZIMAGE); return; } lruCache_.Erase(resourcePtr); - FinishTrace(HITRACE_TAG_COMMONLIBRARY); + FinishTrace(HITRACE_TAG_ZIMAGE); PM_HILOG_DEBUG(LOG_CORE, "[PurgeableResourceManager] RemoveResource resourcePtr: 0x%{public}lx, " "list size: %{public}zu", (long)resourcePtr.get(), lruCache_.Size()); } @@ -268,20 +304,20 @@ void PurgeableResourceManager::Clear() void PurgeableResourceManager::RemoveLastResource() { std::lock_guard lock(lruCacheMutex_); - StartTrace(HITRACE_TAG_COMMONLIBRARY, "OHOS::PurgeableMem::PurgeableResourceManager::RemoveLastResource"); + StartTrace(HITRACE_TAG_ZIMAGE, "OHOS::PurgeableMem::PurgeableResourceManager::RemoveLastResource"); if (lruCache_.Size() == 0) { - FinishTrace(HITRACE_TAG_COMMONLIBRARY); + FinishTrace(HITRACE_TAG_ZIMAGE); return; } std::shared_ptr resourcePtr = lruCache_.GetLastResourcePtr(); if (resourcePtr == nullptr) { - FinishTrace(HITRACE_TAG_COMMONLIBRARY); + FinishTrace(HITRACE_TAG_ZIMAGE); return; } lruCache_.Erase(resourcePtr); - FinishTrace(HITRACE_TAG_COMMONLIBRARY); + FinishTrace(HITRACE_TAG_ZIMAGE); PM_HILOG_DEBUG(LOG_CORE, "[PurgeableResourceManager] RemoveLastResource resourcePtr: 0x%{public}lx, " "list size: %{public}zu", (long)resourcePtr.get(), lruCache_.Size()); } diff --git a/purgeable_builder/src/purgeable_pixelmap_builder.cpp b/purgeable_builder/src/purgeable_pixelmap_builder.cpp index 2c84ae6..daed3de 100644 --- a/purgeable_builder/src/purgeable_pixelmap_builder.cpp +++ b/purgeable_builder/src/purgeable_pixelmap_builder.cpp @@ -165,9 +165,7 @@ bool MakePixelMapToBePurgeable(std::unique_ptr &pixelMap, std::unique_ 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; + return MakePixelMapToBePurgeableByFd(pixelMap.get(), fd, opts, decodeOpts); } bool MakePixelMapToBePurgeableByFd(PixelMap *pixelMap, const int fd, const SourceOptions &opts, -- Gitee