From 851c38099090e3d12f53c669b5d9b72227d956b7 Mon Sep 17 00:00:00 2001 From: lixiang Date: Mon, 29 Apr 2024 11:18:47 +0800 Subject: [PATCH] Update interface and their lock for libpurgeablemem Signed-off-by: lixiang Change-Id: Iac27bffc226e3440da80b3efa43c45ed0b53ee10 --- .../cpp/include/purgeable_mem_base.h | 3 - .../cpp/src/purgeable_mem_base.cpp | 110 ++++-------------- libpurgeablemem/test/purgeableashmem_test.cpp | 4 +- 3 files changed, 22 insertions(+), 95 deletions(-) diff --git a/libpurgeablemem/cpp/include/purgeable_mem_base.h b/libpurgeablemem/cpp/include/purgeable_mem_base.h index 53d459f..1567e85 100644 --- a/libpurgeablemem/cpp/include/purgeable_mem_base.h +++ b/libpurgeablemem/cpp/include/purgeable_mem_base.h @@ -97,8 +97,6 @@ public: void SetRebuildSuccessCallback(std::function &callback); bool IsDataValid(); void SetDataValid(bool target); - bool BeginReadWithDataLock(); - void EndReadWithDataLock(); PurgeableMemBase(); virtual ~PurgeableMemBase(); @@ -113,7 +111,6 @@ protected: bool isDataValid_ {true}; size_t dataSizeInput_ = 0; std::unique_ptr builder_ = nullptr; - std::shared_mutex rwlock_; unsigned int buildDataCount_ = 0; bool BuildContent(); bool IfNeedRebuild(); diff --git a/libpurgeablemem/cpp/src/purgeable_mem_base.cpp b/libpurgeablemem/cpp/src/purgeable_mem_base.cpp index 75c3eae..4d4808a 100644 --- a/libpurgeablemem/cpp/src/purgeable_mem_base.cpp +++ b/libpurgeablemem/cpp/src/purgeable_mem_base.cpp @@ -53,6 +53,11 @@ PurgeableMemBase::~PurgeableMemBase() bool PurgeableMemBase::BeginRead() { + std::lock_guard lock(dataLock_); + if (!isDataValid_) { + return false; + } + bool succ = false; bool ret = false; int tryTimes = 0; @@ -63,35 +68,20 @@ bool PurgeableMemBase::BeginRead() Pin(); PMState err = PM_OK; while (true) { - try { - rwlock_.lock_shared(); - } catch (...) { - err = PM_LOCK_READ_FAIL; - break; - } if (!IfNeedRebuild()) { PM_HILOG_DEBUG(LOG_CORE, "%{public}s: not purged, return true. MAP_PUR=0x%{public}x", __func__, MAP_PURGEABLE); ret = true; break; } - /* data is purged, will rebuild it */ - rwlock_.unlock_shared(); - try { - rwlock_.lock(); - } catch (...) { - err = PM_LOCK_WRITE_FAIL; - break; - } - if (IfNeedRebuild()) { - succ = BuildContent(); - if (succ) { - AfterRebuildSucc(); - } - PM_HILOG_DEBUG(LOG_CORE, "%{public}s: purged, built %{public}s", __func__, succ ? "succ" : "fail"); + + succ = BuildContent(); + if (succ) { + AfterRebuildSucc(); } + PM_HILOG_DEBUG(LOG_CORE, "%{public}s: purged, built %{public}s", __func__, succ ? "succ" : "fail"); + tryTimes++; - rwlock_.unlock(); if (!succ || tryTimes > MAX_BUILD_TRYTIMES) { err = PMB_BUILD_ALL_FAIL; break; @@ -108,14 +98,17 @@ bool PurgeableMemBase::BeginRead() void PurgeableMemBase::EndRead() { - PM_HILOG_DEBUG(LOG_CORE, "%{public}s %{public}s", __func__, ToString().c_str()); - rwlock_.unlock_shared(); - Unpin(); + if (isDataValid_) { + Unpin(); + } + + return; } bool PurgeableMemBase::BeginWrite() { PM_HILOG_DEBUG(LOG_CORE, "%{public}s %{public}s", __func__, ToString().c_str()); + std::lock_guard lock(dataLock_); if (dataPtr_ == nullptr) { return false; } @@ -125,12 +118,6 @@ bool PurgeableMemBase::BeginWrite() Pin(); PMState err = PM_OK; do { - try { - rwlock_.lock(); - } catch (...) { - err = PM_LOCK_WRITE_FAIL; - break; - } if (!IfNeedRebuild()) { /* data is not purged, return true */ break; @@ -148,7 +135,6 @@ bool PurgeableMemBase::BeginWrite() return true; } - rwlock_.unlock(); PM_HILOG_ERROR(LOG_CORE, "%{public}s: err %{public}s, UxptePut.", __func__, GetPMStateName(err)); Unpin(); return false; @@ -157,71 +143,13 @@ bool PurgeableMemBase::BeginWrite() void PurgeableMemBase::EndWrite() { PM_HILOG_DEBUG(LOG_CORE, "%{public}s %{public}s", __func__, ToString().c_str()); - rwlock_.unlock(); Unpin(); } -bool PurgeableMemBase::BeginReadWithDataLock() -{ - if (!isDataValid_) { - return false; - } - - std::lock_guard lock(dataLock_); - if (!isDataValid_) { - return false; - } - - bool succ = false; - bool ret = false; - int tryTimes = 0; - - PM_HILOG_DEBUG(LOG_CORE, "%{public}s %{public}s", __func__, ToString().c_str()); - IF_NULL_LOG_ACTION(dataPtr_, "dataPtr is nullptr in BeginRead", return false); - IF_NULL_LOG_ACTION(builder_, "builder_ is nullptr in BeginRead", return false); - Pin(); - PMState err = PM_OK; - while (true) { - if (!IfNeedRebuild()) { - PM_HILOG_DEBUG(LOG_CORE, "%{public}s: not purged, return true. MAP_PUR=0x%{public}x", - __func__, MAP_PURGEABLE); - ret = true; - break; - } - - succ = BuildContent(); - if (succ) { - AfterRebuildSucc(); - } - PM_HILOG_DEBUG(LOG_CORE, "%{public}s: purged, built %{public}s", __func__, succ ? "succ" : "fail"); - - tryTimes++; - if (!succ || tryTimes > MAX_BUILD_TRYTIMES) { - err = PMB_BUILD_ALL_FAIL; - break; - } - } - - if (!ret) { - PM_HILOG_ERROR(LOG_CORE, "%{public}s: err %{public}s, UxptePut. tryTime:%{public}d", - __func__, GetPMStateName(err), tryTimes); - Unpin(); - } - return ret; -} - -void PurgeableMemBase::EndReadWithDataLock() -{ - if (isDataValid_) { - Unpin(); - } - - return; -} - bool PurgeableMemBase::ModifyContentByBuilder(std::unique_ptr modifier) { IF_NULL_LOG_ACTION(modifier, "input modifier is nullptr", return false); + std::lock_guard lock(dataLock_); if (!modifier->Build(dataPtr_, dataSizeInput_)) { PM_HILOG_ERROR(LOG_CORE, "%{public}s: modify content by builder fail!!", __func__); return false; @@ -249,11 +177,13 @@ void PurgeableMemBase::AfterRebuildSucc() void *PurgeableMemBase::GetContent() { + std::lock_guard lock(dataLock_); return dataPtr_; } size_t PurgeableMemBase::GetContentSize() { + std::lock_guard lock(dataLock_); return dataSizeInput_; } diff --git a/libpurgeablemem/test/purgeableashmem_test.cpp b/libpurgeablemem/test/purgeableashmem_test.cpp index 3b83ad9..99d5887 100644 --- a/libpurgeablemem/test/purgeableashmem_test.cpp +++ b/libpurgeablemem/test/purgeableashmem_test.cpp @@ -579,9 +579,9 @@ HWTEST_F(PurgeableAshmemTest, IsPurgedTest, TestSize.Level1) pobj.dataPtr_ = nullptr; ModifyPurgMemByBuilder(&pobj, std::move(modA2B)); pobj.isDataValid_ = false; - pobj.BeginReadWithDataLock(); + pobj.BeginRead(); pobj.isDataValid_ = true; - pobj.EndReadWithDataLock(); + pobj.EndRead(); } HWTEST_F(PurgeableAshmemTest, GetPinStatusTest, TestSize.Level1) -- Gitee