From e0106252b60d2f28daf3a4310187385efbae46f9 Mon Sep 17 00:00:00 2001 From: dongsenhao Date: Wed, 16 Aug 2023 12:53:13 +0800 Subject: [PATCH 01/11] repair purgeableresourcemanager_test Signed-off-by: dongsenhao --- libpurgeablemem/cpp/src/purgeable_resource_manager.cpp | 4 ++++ libpurgeablemem/test/purgeableresourcemanager_test.cpp | 9 +++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/libpurgeablemem/cpp/src/purgeable_resource_manager.cpp b/libpurgeablemem/cpp/src/purgeable_resource_manager.cpp index 7e7dffb..cd40cb9 100644 --- a/libpurgeablemem/cpp/src/purgeable_resource_manager.cpp +++ b/libpurgeablemem/cpp/src/purgeable_resource_manager.cpp @@ -201,6 +201,10 @@ void PurgeableResourceManager::EndAccessPurgeableMem() void PurgeableResourceManager::ChangeDataValid(std::shared_ptr resourcePtr, bool isVaild) const { + if (resourcePtr == nullptr) { + return; + } + StartTrace(HITRACE_TAG_ZIMAGE, "OHOS::PurgeableMem::PurgeableResourceManager::ChangeDataValid"); std::lock_guard dataLock(resourcePtr->dataLock_); resourcePtr->SetDataValid(isVaild); diff --git a/libpurgeablemem/test/purgeableresourcemanager_test.cpp b/libpurgeablemem/test/purgeableresourcemanager_test.cpp index 1a2060d..17ec71e 100644 --- a/libpurgeablemem/test/purgeableresourcemanager_test.cpp +++ b/libpurgeablemem/test/purgeableresourcemanager_test.cpp @@ -144,10 +144,10 @@ HWTEST_F(PurgeableResourceManagerTest, EndAccessPurgeableMemTest, TestSize.Level HWTEST_F(PurgeableResourceManagerTest, AddResourceTest, TestSize.Level1) { std::shared_ptr key = std::make_shared(); - PurgeableResourceManager::GetInstance().AddResource(nullptr); PurgeableResourceManager::GetInstance().AddResource(key); - EXPECT_EQ(PurgeableResourceManager::GetInstance().lruCache_.Size(), 1); + PurgeableResourceManager::GetInstance().AddResource(nullptr); PurgeableResourceManager::GetInstance().Clear(); + EXPECT_EQ(PurgeableResourceManager::GetInstance().lruCache_.Size(), 0); } HWTEST_F(PurgeableResourceManagerTest, RemoveResourceTest, TestSize.Level1) @@ -155,10 +155,11 @@ HWTEST_F(PurgeableResourceManagerTest, RemoveResourceTest, TestSize.Level1) std::shared_ptr key = std::make_shared(); PurgeableResourceManager::GetInstance().RemoveResource(nullptr); PurgeableResourceManager::GetInstance().AddResource(key); - EXPECT_EQ(PurgeableResourceManager::GetInstance().lruCache_.Size(), 1); PurgeableResourceManager::GetInstance().RemoveResource(key); - EXPECT_EQ(PurgeableResourceManager::GetInstance().lruCache_.Size(), 0); + PurgeableResourceManager::GetInstance().ChangeDataValid(key, true) ; + PurgeableResourceManager::GetInstance().ChangeDataValid(nullptr, true); PurgeableResourceManager::GetInstance().Clear(); + EXPECT_EQ(PurgeableResourceManager::GetInstance().lruCache_.Size(), 0); } HWTEST_F(PurgeableResourceManagerTest, SetRecentUsedResourceTest, TestSize.Level1) -- Gitee From 293c70a7e989f4ac88bdb0d84656304680b37a68 Mon Sep 17 00:00:00 2001 From: zhoumengjie Date: Wed, 16 Aug 2023 17:02:48 +0800 Subject: [PATCH 02/11] move purgeable_builder Signed-off-by: zhoumengjie Change-Id: I07fec3db1f815aba25990e4b3b59239843b0a5d3 --- bundle.json | 13 +- purgeable_builder/BUILD.gn | 44 ---- .../include/purgeable_pixelmap_builder.h | 63 ----- .../src/purgeable_pixelmap_builder.cpp | 222 ------------------ 4 files changed, 1 insertion(+), 341 deletions(-) delete mode 100644 purgeable_builder/BUILD.gn delete mode 100644 purgeable_builder/include/purgeable_pixelmap_builder.h delete mode 100644 purgeable_builder/src/purgeable_pixelmap_builder.cpp diff --git a/bundle.json b/bundle.json index 17c1118..8a34f71 100644 --- a/bundle.json +++ b/bundle.json @@ -24,7 +24,6 @@ "hitrace", "init", "ipc", - "image_framework", "ffrt" ], "third_party": [] @@ -34,8 +33,7 @@ "//commonlibrary/memory_utils/libdmabufheap:libdmabufheap", "//commonlibrary/memory_utils/libmeminfo:libmeminfo", "//commonlibrary/memory_utils/libpurgeablemem:libpurgeablemem", - "//commonlibrary/memory_utils/libpurgeablemem:purgeable_memory_ndk", - "//commonlibrary/memory_utils/purgeable_builder:pixelmap_builder" + "//commonlibrary/memory_utils/libpurgeablemem:purgeable_memory_ndk" ], "inner_kits": [ { @@ -70,15 +68,6 @@ ], "header_base": "//commonlibrary/memory_utils/libpurgeablemem/cpp/include" } - }, - { - "name": "//commonlibrary/memory_utils/purgeable_builder:pixelmap_builder", - "header": { - "header_files": [ - "purgeable_pixelmap_builder.h" - ], - "header_base": "//commonlibrary/memory_utils/purgeable_builder/include" - } } ], "test": [ diff --git a/purgeable_builder/BUILD.gn b/purgeable_builder/BUILD.gn deleted file mode 100644 index c0f34a6..0000000 --- a/purgeable_builder/BUILD.gn +++ /dev/null @@ -1,44 +0,0 @@ -# Copyright (c) 2023 Huawei Device Co., Ltd. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import("//build/ohos.gni") -import("//commonlibrary/memory_utils/purgeable_mem_config.gni") - -config("purgeable_builder_config") { - include_dirs = [ "include" ] - cflags_cc = [ - "-D_FORTIFY_SOURCE=2", - "-fexceptions", - "-fstack-protector-all", - "-O2", - ] -} - -ohos_shared_library("pixelmap_builder") { - sources = [ "src/purgeable_pixelmap_builder.cpp" ] - include_dirs = [ "include/purgeable_pixelmap_builder.h" ] - defines = [ "IMAGE_PURGEABLE_PIXELMAP" ] - - deps = [ "../libpurgeablemem:libpurgeablemem" ] - external_deps = [ - "c_utils:utils", - "hilog:libhilog", - "hitrace:hitrace_meter", - "image_framework:image", - "image_framework:image_native", - "init:libbegetutil", - ] - public_configs = [ ":purgeable_builder_config" ] - subsystem_name = "commonlibrary" - part_name = "memory_utils" -} diff --git a/purgeable_builder/include/purgeable_pixelmap_builder.h b/purgeable_builder/include/purgeable_pixelmap_builder.h deleted file mode 100644 index cd294ef..0000000 --- a/purgeable_builder/include/purgeable_pixelmap_builder.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#ifndef OHOS_MEMORY_UTILS_PURGEABLE_PIXELMAP_BUILDER_H -#define OHOS_MEMORY_UTILS_PURGEABLE_PIXELMAP_BUILDER_H - -#include "image_source.h" -#include "image_type.h" -#include "pixel_map.h" - -#include "purgeable_ashmem.h" -#include "purgeable_mem_builder.h" -#include "purgeable_resource_manager.h" - -#include "memory.h" - -namespace OHOS { -namespace PurgeableBuilder { -using namespace OHOS::Media; - -class PurgeablePixelMapBuilder : public PurgeableMem::PurgeableMemBuilder { -public: - PurgeablePixelMapBuilder(uint32_t index, std::unique_ptr &imageSource, - DecodeOptions opts); - - bool Build(void *data, size_t size) override; - - ~PurgeablePixelMapBuilder() {} - -private: - uint32_t index_; - DecodeOptions opts_; - std::unique_ptr imageSource_; -}; // class PurgeablePixelMapBuilder - -bool GetSysForPurgeable(); -void SetBuilderToBePurgeable(PixelMap *pixelMap, - std::unique_ptr &builder); -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 -#endif /* OHOS_MEMORY_UTILS_PURGEABLE_PIXELMAP_BUILDER_H */ \ No newline at end of file diff --git a/purgeable_builder/src/purgeable_pixelmap_builder.cpp b/purgeable_builder/src/purgeable_pixelmap_builder.cpp deleted file mode 100644 index db31c21..0000000 --- a/purgeable_builder/src/purgeable_pixelmap_builder.cpp +++ /dev/null @@ -1,222 +0,0 @@ -/* - * Copyright (c) 2023 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "purgeable_pixelmap_builder.h" - -#include "hitrace_meter.h" -#include "hilog/log.h" -#include "media_errors.h" -#include "parameters.h" -#include "purgeable_ashmem.h" -#include "purgeable_mem_base.h" -#include "purgeable_mem_builder.h" -#include "purgeable_resource_manager.h" - -#ifndef _WIN32 -#include "securec.h" -#else -#include "memory.h" -#endif - -namespace OHOS { -namespace PurgeableBuilder { -constexpr HiviewDFX::HiLogLabel LABEL = { LOG_CORE, 0xD001799, "PurgeablePixelMapBuilder" }; -constexpr int THRESHOLD_HEIGHT = 256; -constexpr int THRESHOLD_WIDGHT = 256; -const std::string SYSTEM_PARAM_PURGEABLE_ENABLE = "persist.resourceschedule.memmgr.purgeable.enable"; -const std::string SYSTEM_PARAM_PIXELMAP_THRESHOLD_HEIGHT = "persist.memmgr.purgeable.pixelmap.threshold.height"; -const std::string SYSTEM_PARAM_PIXELMAP_THRESHOLD_WIDGHT = "persist.memmgr.purgeable.pixelmap.threshold.widght"; - -PurgeablePixelMapBuilder::PurgeablePixelMapBuilder(uint32_t index, std::unique_ptr &imageSource, - DecodeOptions opts) - : index_(index), opts_(opts), imageSource_(move(imageSource)) {} - -bool PurgeablePixelMapBuilder::Build(void *data, size_t size) -{ - HiviewDFX::HiLog::Debug(LABEL, "purgeableMem build in."); - uint32_t errorCode; - if (imageSource_ == nullptr) { - return false; - } - - StartTrace(HITRACE_TAG_ZIMAGE, "OHOS::PurgeableBuilder::PixelMapPurgeableMemBuilder::Build"); - std::unique_ptr pixelMap = imageSource_->CreatePixelMap(index_, opts_, errorCode); - if (pixelMap == nullptr || data == nullptr) { - FinishTrace(HITRACE_TAG_ZIMAGE); - return false; - } - - StartTrace(HITRACE_TAG_ZIMAGE, ("OHOS::PurgeableBuilder::PixelMapPurgeableMemBuilder::CopyData " + - std::to_string(size))); - if (memcpy_s((char *)data, size, (char *)pixelMap->GetPixels(), size)) { - FinishTrace(HITRACE_TAG_ZIMAGE); - return false; - } - - DoRebuildSuccessCallback(); - - FinishTrace(HITRACE_TAG_ZIMAGE); // memcpy_s trace - FinishTrace(HITRACE_TAG_ZIMAGE); // PixelMapPurgeableMemBuilder::Build trace - - return true; -} - -bool GetSysForPurgeable() -{ - return system::GetBoolParameter(SYSTEM_PARAM_PURGEABLE_ENABLE, false); -} - -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; - } - - if (pixelMap->GetAllocatorType() == AllocatorType::SHARE_MEM_ALLOC) { - std::shared_ptr tmpPtr = - std::make_shared(std::move(builder)); - bool isChanged = tmpPtr->ChangeAshmemData(pixelMap->GetCapacity(), - *(static_cast(pixelMap->GetFd())), pixelMap->GetWritablePixels()); - if (isChanged) { - pixelMap->SetPurgeableMemPtr(tmpPtr); - pixelMap->GetPurgeableMemPtr()->BeginReadWithDataLock(); - } else { - HiviewDFX::HiLog::Error(LABEL, "ChangeAshmemData fail."); - } - } - - FinishTrace(HITRACE_TAG_ZIMAGE); -} - -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()); - } - - FinishTrace(HITRACE_TAG_ZIMAGE); -} - -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()); - } - - FinishTrace(HITRACE_TAG_ZIMAGE); -} - -bool IfCanBePurgeable(DecodeOptions &decodeOpts) -{ - int thresholdHeight = system::GetIntParameter(SYSTEM_PARAM_PIXELMAP_THRESHOLD_HEIGHT, THRESHOLD_HEIGHT); - int thresholdWidght = system::GetIntParameter(SYSTEM_PARAM_PIXELMAP_THRESHOLD_WIDGHT, THRESHOLD_WIDGHT); - Size size = decodeOpts.desiredSize; - - if (size.height > thresholdHeight || size.width > thresholdWidght) { - return false; - } - return true; -} - -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) -{ - return MakePixelMapToBePurgeableByFd(pixelMap.get(), fd, opts, decodeOpts); -} - -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."); - - if (!GetSysForPurgeable()) { - FinishTrace(HITRACE_TAG_ZIMAGE); - return false; - } - - if (!IfCanBePurgeable(decodeOpts)) { - FinishTrace(HITRACE_TAG_ZIMAGE); - return false; - } - - if (pixelMap == nullptr || backupImgSrc4Rebuild == nullptr) { - HiviewDFX::HiLog::Error(LABEL, "PixelMap or backupImgSrc4Rebuild is null."); - FinishTrace(HITRACE_TAG_ZIMAGE); - return false; - } - - if (pixelMap->IsPurgeable()) { - HiviewDFX::HiLog::Error(LABEL, "PixelMap is already purgeable."); - FinishTrace(HITRACE_TAG_ZIMAGE); - return false; - } - - std::unique_ptr purgeableMemBuilder = - std::make_unique(0, backupImgSrc4Rebuild, decodeOpts); - SetBuilderToBePurgeable(pixelMap, purgeableMemBuilder); - - if (pixelMap->IsPurgeable()) { - AddToPurgeableResourceMgr(pixelMap); - } - - FinishTrace(HITRACE_TAG_ZIMAGE); - return true; -} -} // namespace PurgeableBuilder -} // namespace OHOS \ No newline at end of file -- Gitee From 1ce511e93d757bdcc7afdce9b80a29fa6260a434 Mon Sep 17 00:00:00 2001 From: lixiang Date: Thu, 24 Aug 2023 21:19:13 +0800 Subject: [PATCH 03/11] alram handling Signed-off-by: lixiang Change-Id: I017dabb1333d35706142ba5a6dd46faa22ac6c9e --- libpurgeablemem/test/purgeableashmem_test.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libpurgeablemem/test/purgeableashmem_test.cpp b/libpurgeablemem/test/purgeableashmem_test.cpp index 25b017e..2b057bd 100644 --- a/libpurgeablemem/test/purgeableashmem_test.cpp +++ b/libpurgeablemem/test/purgeableashmem_test.cpp @@ -446,7 +446,7 @@ HWTEST_F(PurgeableAshmemTest, MutiPageReadWriteTest, TestSize.Level1) HWTEST_F(PurgeableAshmemTest, MutiMorePageReadWriteTest, TestSize.Level1) { size_t size = 5 * 1024 * 1024; - char *alphabet = (char *)malloc(size); + char *alphabet = static_cast(malloc(size)); size_t len = 0; for (char ch = 'D'; len < size;) { alphabet[len++] = ch; @@ -487,7 +487,7 @@ HWTEST_F(PurgeableAshmemTest, MutiMorePageReadWriteTest, TestSize.Level1) HWTEST_F(PurgeableAshmemTest, StableMutiMorePageReadWriteTest, TestSize.Level1) { size_t size = 5 * 1024 * 1024; - char *alphabet = (char *)malloc(size); + char *alphabet = static_cast(malloc(size)); size_t len = 0; for (char ch = 'D'; len < size;) { alphabet[len++] = ch; -- Gitee From a6ffe9172c121e3395c5342e33f10c33b1c3525f Mon Sep 17 00:00:00 2001 From: dongsenhao Date: Thu, 31 Aug 2023 21:09:04 +0800 Subject: [PATCH 04/11] Increase purgeable_c_test and purgebleashmem_test branch coverage of test Signed-off-by: dongsenhao --- libpurgeablemem/test/purgeable_c_test.cpp | 1 + libpurgeablemem/test/purgeableashmem_test.cpp | 72 ++++++++++++++++++- 2 files changed, 72 insertions(+), 1 deletion(-) diff --git a/libpurgeablemem/test/purgeable_c_test.cpp b/libpurgeablemem/test/purgeable_c_test.cpp index d46d177..f3f3e54 100644 --- a/libpurgeablemem/test/purgeable_c_test.cpp +++ b/libpurgeablemem/test/purgeable_c_test.cpp @@ -75,6 +75,7 @@ HWTEST_F(PurgeableCTest, MultiObjCreateTest, TestSize.Level1) { const char alphabetFinal[] = "BBCDEFGHIJKLMNOPQRSTUVWXYZ\0"; struct AlphabetInitParam initPara = {'A', 'Z'}; + PurgMemCreate(0, InitAlphabet, &initPara); struct PurgMem *pobj1 = PurgMemCreate(27, InitAlphabet, &initPara); LoopPrintAlphabet(pobj1, 1); struct AlphabetModifyParam a2b = {'A', 'B'}; diff --git a/libpurgeablemem/test/purgeableashmem_test.cpp b/libpurgeablemem/test/purgeableashmem_test.cpp index 2b057bd..fc3bef2 100644 --- a/libpurgeablemem/test/purgeableashmem_test.cpp +++ b/libpurgeablemem/test/purgeableashmem_test.cpp @@ -25,9 +25,14 @@ #include "gtest/gtest.h" #include "ashmem.h" -#include "purgeable_ashmem.h" #include "securec.h" +#define private public +#define protected public +#include "purgeable_ashmem.h" +#undef private +#undef protected + namespace OHOS { namespace PurgeableMem { using namespace testing; @@ -554,6 +559,71 @@ HWTEST_F(PurgeableAshmemTest, InvalidInputBuilderTest, TestSize.Level1) EXPECT_EQ(ret, false); } +HWTEST_F(PurgeableAshmemTest, IsPurgedTest, TestSize.Level1) +{ + std::unique_ptr builder1 = std::make_unique('A', 'Z'); + std::unique_ptr modA2B = std::make_unique('A', 'B'); + PurgeableAshMem pobj(std::move(builder1)); + pobj.isSupport_ = 0; + EXPECT_EQ(pobj.IsPurged(), false); + EXPECT_EQ(pobj.Pin(), true); + EXPECT_EQ(pobj.Unpin(), true); + EXPECT_EQ(pobj.GetPinStatus(), false); + pobj.isSupport_ = 1; + pobj.ashmemFd_ = 0; + EXPECT_EQ(pobj.Pin(), false); + EXPECT_EQ(pobj.Unpin(), false); + pobj.dataSizeInput_ = 0; + EXPECT_EQ(pobj.CreatePurgeableData_(), false); + pobj.dataPtr_ = nullptr; + ModifyPurgMemByBuilder(&pobj, std::move(modA2B)); + pobj.isDataValid_ = false; + pobj.BeginReadWithDataLock(); + pobj.isDataValid_ = true; + pobj.EndReadWithDataLock(); +} + +HWTEST_F(PurgeableAshmemTest, GetPinStatusTest, TestSize.Level1) +{ + std::unique_ptr builder1 = std::make_unique('A', 'Z'); + PurgeableAshMem pobj(std::move(builder1)); + pobj.isSupport_ = 1; + EXPECT_NE(pobj.GetPinStatus(), 0); + pobj.isSupport_ = 0; + EXPECT_EQ(pobj.GetPinStatus(), 0); +} + +HWTEST_F(PurgeableAshmemTest, ChangeAshmemDataTest, TestSize.Level1) +{ + std::unique_ptr builder1 = std::make_unique('A', 'Z'); + PurgeableAshMem pobj1(27, std::move(builder1)); + PurgeableAshMem pobj2(27, std::move(builder1)); + PurgeableAshMem pobj3(27, std::move(builder1)); + PurgeableAshMem pobj4(27, std::move(builder1)); + size_t newSize = 0; + size_t size = 123; + int fd = 5; + int intdata = 12345; + void *data = &intdata; + size_t page_size = 1 << 12; + pobj1.ResizeData(newSize); + newSize = 1; + pobj1.ResizeData(newSize); + pobj2.ashmemFd_ = 0; + pobj2.ResizeData(newSize); + pobj2.dataPtr_ = data; + pobj2.ResizeData(newSize); + + pobj3.ChangeAshmemData(size, fd, data); + pobj4.ashmemFd_ = 0; + pobj4.ChangeAshmemData(size, fd, data); + pobj4.dataPtr_ = data; + pobj4.ChangeAshmemData(size, fd, data); + size = ((pobj4.dataSizeInput_ + page_size - 1) / page_size) * page_size; + fd = AshmemCreate("PurgeableAshmem", size); + EXPECT_EQ(pobj4.ChangeAshmemData(size, fd, data), true); +} + void LoopPrintAlphabet(PurgeableAshMem *pdata, unsigned int loopCount) { std::cout << "inter " << __func__ << std::endl; -- Gitee From 3836436f1309c5cbc2c5ff023446dc2b8f4d6ebd Mon Sep 17 00:00:00 2001 From: dongsenhao Date: Fri, 1 Sep 2023 15:26:25 +0800 Subject: [PATCH 05/11] Change variable naming style Signed-off-by: dongsenhao --- libpurgeablemem/test/purgeableashmem_test.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libpurgeablemem/test/purgeableashmem_test.cpp b/libpurgeablemem/test/purgeableashmem_test.cpp index fc3bef2..121a3d7 100644 --- a/libpurgeablemem/test/purgeableashmem_test.cpp +++ b/libpurgeablemem/test/purgeableashmem_test.cpp @@ -605,7 +605,7 @@ HWTEST_F(PurgeableAshmemTest, ChangeAshmemDataTest, TestSize.Level1) int fd = 5; int intdata = 12345; void *data = &intdata; - size_t page_size = 1 << 12; + size_t pageSize = 1 << 12; pobj1.ResizeData(newSize); newSize = 1; pobj1.ResizeData(newSize); @@ -619,7 +619,7 @@ HWTEST_F(PurgeableAshmemTest, ChangeAshmemDataTest, TestSize.Level1) pobj4.ChangeAshmemData(size, fd, data); pobj4.dataPtr_ = data; pobj4.ChangeAshmemData(size, fd, data); - size = ((pobj4.dataSizeInput_ + page_size - 1) / page_size) * page_size; + size = ((pobj4.dataSizeInput_ + pageSize - 1) / pageSize) * pageSize; fd = AshmemCreate("PurgeableAshmem", size); EXPECT_EQ(pobj4.ChangeAshmemData(size, fd, data), true); } -- Gitee From 24350b3631d1b20e2e723062a45200ffc0990153 Mon Sep 17 00:00:00 2001 From: lixiang Date: Mon, 11 Sep 2023 15:26:50 +0800 Subject: [PATCH 06/11] Signed-off-by: lixiang Change-Id: I2af3c266c7a8d25a2b01e69cc7e5d2ce0dbff4c5 Change-Id: Ie0e2c438afeb1743efb08dbb9b87fba4ff858c18 Signed-off-by: lixiang --- libpurgeablemem/cpp/include/purgeable_resource_manager.h | 2 +- libpurgeablemem/cpp/src/purgeable_resource_manager.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libpurgeablemem/cpp/include/purgeable_resource_manager.h b/libpurgeablemem/cpp/include/purgeable_resource_manager.h index 1f40ea7..863fee2 100644 --- a/libpurgeablemem/cpp/include/purgeable_resource_manager.h +++ b/libpurgeablemem/cpp/include/purgeable_resource_manager.h @@ -89,7 +89,7 @@ private: size_t Size() const; private: - int32_t lruCacheCapacity_; + size_t lruCacheCapacity_ = 0; std::list> resourcePtrList_; std::unordered_map, ListSharedPtrIterator> positionMap_; }; diff --git a/libpurgeablemem/cpp/src/purgeable_resource_manager.cpp b/libpurgeablemem/cpp/src/purgeable_resource_manager.cpp index cd40cb9..c111ced 100644 --- a/libpurgeablemem/cpp/src/purgeable_resource_manager.cpp +++ b/libpurgeablemem/cpp/src/purgeable_resource_manager.cpp @@ -57,7 +57,7 @@ void PurgeableResourceManager::LruCache::Insert(std::shared_ptr(resourcePtrList_.size()) > lruCacheCapacity_) { + if (resourcePtrList_.size() > lruCacheCapacity_) { auto popResource = resourcePtrList_.back(); if (popResource->GetPinStatus() == 0) { popResource->Pin(); @@ -90,7 +90,7 @@ void PurgeableResourceManager::LruCache::SetCapacity(int32_t capacity) } lruCacheCapacity_ = capacity; - while (lruCacheCapacity_ < static_cast(Size())) { + while (lruCacheCapacity_ < Size()) { Erase(resourcePtrList_.back()); } } -- Gitee From 3bc52959429928dda268c89622129f23747822af Mon Sep 17 00:00:00 2001 From: lixiang Date: Tue, 12 Sep 2023 09:14:24 +0800 Subject: [PATCH 07/11] TicketNo:DTS2023090806536 Change-Id: I3d571e1f874304e09edfd01c1406af0874e2be70 Signed-off-by: lixiang --- .../cpp/include/purgeable_mem_base.h | 4 ++++ libpurgeablemem/cpp/src/purgeable_ashmem.cpp | 17 ++++++++++++++--- libpurgeablemem/cpp/src/purgeable_mem.cpp | 16 ++++++++++++---- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/libpurgeablemem/cpp/include/purgeable_mem_base.h b/libpurgeablemem/cpp/include/purgeable_mem_base.h index f16187b..aa81f40 100644 --- a/libpurgeablemem/cpp/include/purgeable_mem_base.h +++ b/libpurgeablemem/cpp/include/purgeable_mem_base.h @@ -16,6 +16,10 @@ #ifndef OHOS_UTILS_MEMORY_LIBPURGEABLEMEM_CPP_INCLUDE_PURGEABLE_MEM_BASE_H #define OHOS_UTILS_MEMORY_LIBPURGEABLEMEM_CPP_INCLUDE_PURGEABLE_MEM_BASE_H +#ifndef OHOS_MAXIMUM_PURGEABLE_MEMORY +#define OHOS_MAXIMUM_PURGEABLE_MEMORY ((1024) * (1024) * (1024)) /* 1G */ +#endif /* OHOS_MAXIMUM_PURGEABLE_MEMORY */ + #include /* unique_ptr */ #include /* shared_mutex */ #include diff --git a/libpurgeablemem/cpp/src/purgeable_ashmem.cpp b/libpurgeablemem/cpp/src/purgeable_ashmem.cpp index 70b438d..068f708 100644 --- a/libpurgeablemem/cpp/src/purgeable_ashmem.cpp +++ b/libpurgeablemem/cpp/src/purgeable_ashmem.cpp @@ -65,7 +65,10 @@ PurgeableAshMem::PurgeableAshMem(size_t dataSize, std::unique_ptr= OHOS_MAXIMUM_PURGEABLE_MEMORY) { + PM_HILOG_DEBUG(LOG_CORE, "Failed to apply for memory"); return; } if (dataPtr_) { @@ -198,11 +202,18 @@ void PurgeableAshMem::ResizeData(size_t newSize) } } dataSizeInput_ = newSize; - CreatePurgeableData_(); + if (!CreatePurgeableData_()) { + PM_HILOG_DEBUG(LOG_CORE, "Failed to create purgeabledata"); + return; + } } bool PurgeableAshMem::ChangeAshmemData(size_t size, int fd, void *data) { + if (size <= 0 || size >= OHOS_MAXIMUM_PURGEABLE_MEMORY) { + PM_HILOG_DEBUG(LOG_CORE, "Failed to apply for memory"); + return false; + } if (dataPtr_) { if (munmap(dataPtr_, RoundUp(dataSizeInput_, PAGE_SIZE)) != 0) { PM_HILOG_ERROR(LOG_CORE, "%{public}s: munmap dataPtr fail", __func__); diff --git a/libpurgeablemem/cpp/src/purgeable_mem.cpp b/libpurgeablemem/cpp/src/purgeable_mem.cpp index 1ee83a0..c7b9b1b 100644 --- a/libpurgeablemem/cpp/src/purgeable_mem.cpp +++ b/libpurgeablemem/cpp/src/purgeable_mem.cpp @@ -45,13 +45,17 @@ PurgeableMem::PurgeableMem(size_t dataSize, std::unique_ptr pageTable_ = nullptr; buildDataCount_ = 0; - if (dataSize == 0) { + if (dataSize <= 0 || dataSize >= OHOS_MAXIMUM_PURGEABLE_MEMORY) { + PM_HILOG_DEBUG(LOG_CORE, "Failed to apply for memory"); return; } dataSizeInput_ = dataSize; IF_NULL_LOG_ACTION(builder, "%{public}s: input builder nullptr", return); - CreatePurgeableData_(); + if (!CreatePurgeableData_()) { + PM_HILOG_DEBUG(LOG_CORE, "Failed to create purgeabledata"); + return; + } builder_ = std::move(builder); PM_HILOG_DEBUG(LOG_CORE, "%{public}s init succ. %{public}s", __func__, ToString().c_str()); } @@ -123,7 +127,8 @@ int PurgeableMem::GetPinStatus() const void PurgeableMem::ResizeData(size_t newSize) { - if (newSize <= 0) { + if (newSize <= 0 || newSize >= OHOS_MAXIMUM_PURGEABLE_MEMORY) { + PM_HILOG_DEBUG(LOG_CORE, "Failed to apply for memory"); return; } if (dataPtr_) { @@ -134,7 +139,10 @@ void PurgeableMem::ResizeData(size_t newSize) } } dataSizeInput_ = newSize; - CreatePurgeableData_(); + if (!CreatePurgeableData_()) { + PM_HILOG_DEBUG(LOG_CORE, "Failed to create purgeabledata"); + return; + } } inline std::string PurgeableMem::ToString() const -- Gitee From 988898f46ef6671cd1021ef5d2b6d1c24a12ab5a Mon Sep 17 00:00:00 2001 From: lixiang Date: Wed, 13 Sep 2023 10:35:46 +0800 Subject: [PATCH 08/11] Signed-off-by: lixiang Change-Id: Ic0de44c61aa6de8d417cb478c6edd57a51756fe9 --- libpurgeablemem/cpp/src/purgeable_mem_base.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libpurgeablemem/cpp/src/purgeable_mem_base.cpp b/libpurgeablemem/cpp/src/purgeable_mem_base.cpp index 8b4fe8e..f5fbb99 100644 --- a/libpurgeablemem/cpp/src/purgeable_mem_base.cpp +++ b/libpurgeablemem/cpp/src/purgeable_mem_base.cpp @@ -209,7 +209,7 @@ bool PurgeableMemBase::BeginReadWithDataLock() void PurgeableMemBase::EndReadWithDataLock() { if (isDataValid_) { - EndRead(); + Unpin(); } return; -- Gitee From 71df0a408f715d42b834cc5beb6c9026bc8b87cb Mon Sep 17 00:00:00 2001 From: dongsenhao Date: Wed, 13 Sep 2023 11:14:30 +0800 Subject: [PATCH 09/11] add interface test case coverage Signed-off-by: dongsenhao --- libpurgeablemem/test/purgeable_cpp_test.cpp | 41 +++++++++++++++++++ libpurgeablemem/test/purgeableashmem_test.cpp | 14 ++++++- .../test/purgeableresourcemanager_test.cpp | 2 + 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/libpurgeablemem/test/purgeable_cpp_test.cpp b/libpurgeablemem/test/purgeable_cpp_test.cpp index 20fbcc5..e969f1a 100644 --- a/libpurgeablemem/test/purgeable_cpp_test.cpp +++ b/libpurgeablemem/test/purgeable_cpp_test.cpp @@ -13,12 +13,19 @@ * limitations under the License. */ +#include #include #include #include /* unique_ptr */ #include #include "gtest/gtest.h" +#include "pm_util.h" + +#define private public +#define protected public #include "purgeable_mem.h" +#undef private +#undef protected namespace OHOS { namespace PurgeableMem { @@ -447,6 +454,40 @@ HWTEST_F(PurgeableCppTest, InvalidInputBuilderTest, TestSize.Level1) EXPECT_EQ(ret, false); } +HWTEST_F(PurgeableCppTest, ResizeDataTest, TestSize.Level1) +{ + std::unique_ptr builder = std::make_unique('A', 'Z'); + PurgeableMem *pobj1 = new PurgeableMem(27, std::move(builder)); + PurgeableMem *pobj2 = new PurgeableMem(27, std::move(builder)); + std::function callback = std::bind(&PurgeableMem::IsDataValid, pobj1); + size_t pageSize = PAGE_SIZE; + LoopReclaimPurgeable(1); + + size_t newSize = 0; + int intdata = 12345; + void *data = &intdata; + pobj1->ResizeData(newSize); + newSize = 1; + pobj1->ResizeData(newSize); + size_t roundip = ((pobj2->dataSizeInput_ + pageSize) / pageSize) * pageSize; + munmap(pobj2->dataPtr_, roundip); + pobj2->ResizeData(newSize); + roundip = ((pobj2->dataSizeInput_ + pageSize) / pageSize) * pageSize; + munmap(pobj2->dataPtr_, roundip); + pobj2->dataPtr_ = data; + pobj2->ResizeData(newSize); + EXPECT_NE(pobj2->dataPtr_, nullptr); + pobj1->builder_->DoRebuildSuccessCallback(); + pobj1->builder_->SetRebuildSuccessCallback(callback); + pobj1->builder_->DoRebuildSuccessCallback(); + pobj1->builder_ = nullptr; + pobj1->SetRebuildSuccessCallback(callback); + delete pobj1; + delete pobj2; + pobj1 = nullptr; + pobj2 = nullptr; +} + void LoopPrintAlphabet(PurgeableMem *pdata, unsigned int loopCount) { std::cout << "inter " << __func__ << std::endl; diff --git a/libpurgeablemem/test/purgeableashmem_test.cpp b/libpurgeablemem/test/purgeableashmem_test.cpp index 121a3d7..a9afb02 100644 --- a/libpurgeablemem/test/purgeableashmem_test.cpp +++ b/libpurgeablemem/test/purgeableashmem_test.cpp @@ -26,6 +26,7 @@ #include "gtest/gtest.h" #include "ashmem.h" #include "securec.h" +#include "pm_util.h" #define private public #define protected public @@ -605,7 +606,7 @@ HWTEST_F(PurgeableAshmemTest, ChangeAshmemDataTest, TestSize.Level1) int fd = 5; int intdata = 12345; void *data = &intdata; - size_t pageSize = 1 << 12; + size_t pageSize = PAGE_SIZE; pobj1.ResizeData(newSize); newSize = 1; pobj1.ResizeData(newSize); @@ -624,6 +625,17 @@ HWTEST_F(PurgeableAshmemTest, ChangeAshmemDataTest, TestSize.Level1) EXPECT_EQ(pobj4.ChangeAshmemData(size, fd, data), true); } +HWTEST_F(PurgeableAshmemTest, GetContentSizeTest, TestSize.Level1) +{ + std::unique_ptr builder1 = std::make_unique('A', 'Z'); + PurgeableAshMem pobj(27, std::move(builder1)); + EXPECT_EQ(pobj.GetContentSize(), 27); + bool target = true; + pobj.SetDataValid(target); + EXPECT_EQ(pobj.IsDataValid(), target); + EXPECT_NE(pobj.GetAshmemFd(), -1); +} + void LoopPrintAlphabet(PurgeableAshMem *pdata, unsigned int loopCount) { std::cout << "inter " << __func__ << std::endl; diff --git a/libpurgeablemem/test/purgeableresourcemanager_test.cpp b/libpurgeablemem/test/purgeableresourcemanager_test.cpp index 17ec71e..f73a28c 100644 --- a/libpurgeablemem/test/purgeableresourcemanager_test.cpp +++ b/libpurgeablemem/test/purgeableresourcemanager_test.cpp @@ -191,6 +191,8 @@ HWTEST_F(PurgeableResourceManagerTest, RemoveLastResourceTest, TestSize.Level1) PurgeableResourceManager::GetInstance().RemoveLastResource(); PurgeableResourceManager::GetInstance().ShowLruCache(); EXPECT_EQ(PurgeableResourceManager::GetInstance().lruCache_.Size(), 0); + size_t newSize = 0; + key->ResizeData(newSize); } } } -- Gitee From 75ddc578f3a7e32716bc59812a411e76d78e555f Mon Sep 17 00:00:00 2001 From: lixiang Date: Wed, 13 Sep 2023 15:00:22 +0800 Subject: [PATCH 10/11] Change-Id: I4fed2b082b09b46d7648e2c9eb86b8d44add5f07 Signed-off-by: lixiang Change-Id: I82471bea10c7d816ee42842da9021d866c3a6af1 --- libpurgeablemem/c/src/purgeable_mem_c.c | 4 ++++ libpurgeablemem/common/src/ux_page_table_c.c | 4 ++++ libpurgeablemem/cpp/src/purgeable_ashmem.cpp | 4 ++++ libpurgeablemem/cpp/src/purgeable_mem.cpp | 4 ++++ libpurgeablemem/cpp/src/purgeable_mem_base.cpp | 4 ++++ 5 files changed, 20 insertions(+) diff --git a/libpurgeablemem/c/src/purgeable_mem_c.c b/libpurgeablemem/c/src/purgeable_mem_c.c index 8671c73..a9dd887 100644 --- a/libpurgeablemem/c/src/purgeable_mem_c.c +++ b/libpurgeablemem/c/src/purgeable_mem_c.c @@ -49,6 +49,10 @@ static inline void LogPurgMemInfo_(struct PurgMem *obj) static inline size_t RoundUp(size_t val, size_t align) { + if (val + align < val || val + align < align) { + PM_HILOG_ERROR_C(LOG_CORE, "%{public}s: Addition overflow!", __func__); + return val; + } if (align == 0) { return val; } diff --git a/libpurgeablemem/common/src/ux_page_table_c.c b/libpurgeablemem/common/src/ux_page_table_c.c index de14c41..050ff24 100644 --- a/libpurgeablemem/common/src/ux_page_table_c.c +++ b/libpurgeablemem/common/src/ux_page_table_c.c @@ -92,6 +92,10 @@ static inline size_t GetUxPageSize_(uint64_t dataAddr, size_t dataSize) static inline uint64_t RoundUp(uint64_t val, size_t align) { + if (val + align < val || val + align < align) { + HILOG_ERROR(LOG_CORE, "%{public}s: Addition overflow!", __func__); + return val; + } if (align == 0) { return val; } diff --git a/libpurgeablemem/cpp/src/purgeable_ashmem.cpp b/libpurgeablemem/cpp/src/purgeable_ashmem.cpp index 70b438d..ee71057 100644 --- a/libpurgeablemem/cpp/src/purgeable_ashmem.cpp +++ b/libpurgeablemem/cpp/src/purgeable_ashmem.cpp @@ -32,6 +32,10 @@ namespace PurgeableMem { static inline size_t RoundUp(size_t val, size_t align) { + if (val + align < val || val + align < align) { + PM_HILOG_ERROR(LOG_CORE, "%{public}s: Addition overflow!", __func__); + return val; + } if (align == 0) { return val; } diff --git a/libpurgeablemem/cpp/src/purgeable_mem.cpp b/libpurgeablemem/cpp/src/purgeable_mem.cpp index 1ee83a0..7e25796 100644 --- a/libpurgeablemem/cpp/src/purgeable_mem.cpp +++ b/libpurgeablemem/cpp/src/purgeable_mem.cpp @@ -32,6 +32,10 @@ namespace PurgeableMem { static inline size_t RoundUp(size_t val, size_t align) { + if (val + align < val || val + align < align) { + PM_HILOG_ERROR(LOG_CORE, "%{public}s: Addition overflow!", __func__); + return val; + } if (align == 0) { return val; } diff --git a/libpurgeablemem/cpp/src/purgeable_mem_base.cpp b/libpurgeablemem/cpp/src/purgeable_mem_base.cpp index 8b4fe8e..779651a 100644 --- a/libpurgeablemem/cpp/src/purgeable_mem_base.cpp +++ b/libpurgeablemem/cpp/src/purgeable_mem_base.cpp @@ -33,6 +33,10 @@ const int MAX_BUILD_TRYTIMES = 3; static inline size_t RoundUp(size_t val, size_t align) { + if (val + align < val || val + align < align) { + PM_HILOG_ERROR(LOG_CORE, "%{public}s: Addition overflow!", __func__); + return val; + } if (align == 0) { return val; } -- Gitee From 374f7b23750edab79ffff1fe4d6f1fc9dd37f8a9 Mon Sep 17 00:00:00 2001 From: lixiang Date: Mon, 18 Sep 2023 15:06:39 +0800 Subject: [PATCH 11/11] Signed-off-by: lixiang Change-Id: Idde12b5759fdadfd8e0ffb084f6c760acdd174d3 Signed-off-by: lixiang Change-Id: I35ee58b3e125697fc9598cc9a51f181eaa96d9b9 --- libpurgeablemem/test/purgeableresourcemanager_test.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/libpurgeablemem/test/purgeableresourcemanager_test.cpp b/libpurgeablemem/test/purgeableresourcemanager_test.cpp index f73a28c..c71ba95 100644 --- a/libpurgeablemem/test/purgeableresourcemanager_test.cpp +++ b/libpurgeablemem/test/purgeableresourcemanager_test.cpp @@ -153,11 +153,12 @@ HWTEST_F(PurgeableResourceManagerTest, AddResourceTest, TestSize.Level1) HWTEST_F(PurgeableResourceManagerTest, RemoveResourceTest, TestSize.Level1) { std::shared_ptr key = std::make_shared(); - PurgeableResourceManager::GetInstance().RemoveResource(nullptr); + std::shared_ptr key1 = nullptr; PurgeableResourceManager::GetInstance().AddResource(key); + PurgeableResourceManager::GetInstance().RemoveResource(key1); PurgeableResourceManager::GetInstance().RemoveResource(key); - PurgeableResourceManager::GetInstance().ChangeDataValid(key, true) ; - PurgeableResourceManager::GetInstance().ChangeDataValid(nullptr, true); + PurgeableResourceManager::GetInstance().ChangeDataValid(key, true); + PurgeableResourceManager::GetInstance().ChangeDataValid(key1, true); PurgeableResourceManager::GetInstance().Clear(); EXPECT_EQ(PurgeableResourceManager::GetInstance().lruCache_.Size(), 0); } -- Gitee