From 22a0c9d0f8d75afd826d330db96085d548dac81a Mon Sep 17 00:00:00 2001 From: liuliu Date: Fri, 5 May 2023 11:33:36 +0800 Subject: [PATCH 1/2] fix map find crash Signed-off-by: liuliu Change-Id: I8e4d434fc29adb9690ec6659812533df6826b4c6 --- services/appmgr/include/module_running_record.h | 2 ++ services/appmgr/src/module_running_record.cpp | 13 +++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/services/appmgr/include/module_running_record.h b/services/appmgr/include/module_running_record.h index 9d5201c8523..e43164200eb 100644 --- a/services/appmgr/include/module_running_record.h +++ b/services/appmgr/include/module_running_record.h @@ -20,6 +20,7 @@ #include #include #include +#include #include "iremote_object.h" #include "ability_info.h" @@ -162,6 +163,7 @@ private: ModuleRecordState GetState() const; private: + mutable std::shared_mutex abilitiesMutex_; std::map, std::shared_ptr> abilities_; std::map, std::shared_ptr> terminateAbilities_; std::weak_ptr appMgrServiceInner_; diff --git a/services/appmgr/src/module_running_record.cpp b/services/appmgr/src/module_running_record.cpp index ab69fb3e646..29f2f8a2e13 100644 --- a/services/appmgr/src/module_running_record.cpp +++ b/services/appmgr/src/module_running_record.cpp @@ -55,6 +55,7 @@ std::shared_ptr ModuleRunningRecord::GetAbilityRunningReco HILOG_ERROR("token is null"); return nullptr; } + std::shared_lock lock(abilitiesMutex_); const auto &iter = abilities_.find(token); if (iter != abilities_.end()) { return iter->second; @@ -82,6 +83,7 @@ std::shared_ptr ModuleRunningRecord::AddAbility(const sptr if (want) { abilityRecord->SetOwnerUserId(want->GetIntParam(ABILITY_OWNER_USERID, -1)); } + std::unique_lock lock(abilitiesMutex_); abilities_.emplace(token, abilityRecord); return abilityRecord; } @@ -92,13 +94,14 @@ bool ModuleRunningRecord::IsLastAbilityRecord(const sptr &token) HILOG_ERROR("token is nullptr"); return false; } - + std::shared_lock lock(abilitiesMutex_); return ((abilities_.size() == 1) && (abilities_.find(token) != abilities_.end())); } int32_t ModuleRunningRecord::GetPageAbilitySize() { int pageAbilitySize = 0; + std::shared_lock lock(abilitiesMutex_); for (auto it : abilities_) { std::shared_ptr abilityRunningRecord = it.second; std::shared_ptr abilityInfo = abilityRunningRecord->GetAbilityInfo(); @@ -113,6 +116,7 @@ int32_t ModuleRunningRecord::GetPageAbilitySize() const std::map, std::shared_ptr> &ModuleRunningRecord::GetAbilities() const { + std::shared_lock lock(abilitiesMutex_); return abilities_; } @@ -123,6 +127,7 @@ std::shared_ptr ModuleRunningRecord::GetAbilityByTerminate HILOG_ERROR("GetAbilityByTerminateLists error, token is null"); return nullptr; } + std::shared_lock lock(abilitiesMutex_); const auto &iter = terminateAbilities_.find(token); if (iter != terminateAbilities_.end()) { return iter->second; @@ -133,6 +138,7 @@ std::shared_ptr ModuleRunningRecord::GetAbilityByTerminate std::shared_ptr ModuleRunningRecord::GetAbilityRunningRecord(const int64_t eventId) const { HILOG_INFO("Get ability running record by eventId."); + std::shared_lock lock(abilitiesMutex_); const auto &iter = std::find_if(abilities_.begin(), abilities_.end(), [eventId](const auto &pair) { return pair.second->GetEventId() == eventId; }); @@ -174,6 +180,7 @@ void ModuleRunningRecord::LaunchAbility(const std::shared_ptr lock(abilitiesMutex_); const auto &iter = abilities_.find(ability->GetToken()); if (iter != abilities_.end() && appLifeCycleDeal_->GetApplicationClient()) { HILOG_INFO("Schedule launch ability, name is %{public}s.", ability->GetName().c_str()); @@ -187,7 +194,7 @@ void ModuleRunningRecord::LaunchAbility(const std::shared_ptr lock(abilitiesMutex_); if (abilities_.empty()) { HILOG_ERROR("abilities_ is empty"); return; @@ -211,6 +218,7 @@ void ModuleRunningRecord::TerminateAbility(const std::shared_ptr lock(abilitiesMutex_); terminateAbilities_.emplace(token, abilityRecord); abilities_.erase(token); @@ -262,6 +270,7 @@ void ModuleRunningRecord::AbilityTerminated(const sptr &token) } if (RemoveTerminateAbilityTimeoutTask(token)) { + std::unique_lock lock(abilitiesMutex_); terminateAbilities_.erase(token); } } -- Gitee From d649f58e33b2b7977140ab2f3d3eff24b1ff237b Mon Sep 17 00:00:00 2001 From: liuliu Date: Tue, 16 May 2023 11:32:16 +0800 Subject: [PATCH 2/2] add lock Signed-off-by: liuliu Change-Id: I4f927f62daa9fc9ad72f0e1b2bc06dccb37dc370 --- .../appmgr/include/module_running_record.h | 6 ++-- services/appmgr/src/module_running_record.cpp | 30 ++++++++++--------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/services/appmgr/include/module_running_record.h b/services/appmgr/include/module_running_record.h index e43164200eb..640ca1b58c2 100644 --- a/services/appmgr/include/module_running_record.h +++ b/services/appmgr/include/module_running_record.h @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include "iremote_object.h" #include "ability_info.h" @@ -86,7 +86,7 @@ public: * * @return Returns the abilities info for the application record. */ - const std::map, std::shared_ptr> &GetAbilities() const; + const std::map, std::shared_ptr> GetAbilities() const; std::shared_ptr GetAbilityByTerminateLists(const sptr &token) const; @@ -163,7 +163,7 @@ private: ModuleRecordState GetState() const; private: - mutable std::shared_mutex abilitiesMutex_; + mutable std::recursive_mutex abilitiesMutex_; std::map, std::shared_ptr> abilities_; std::map, std::shared_ptr> terminateAbilities_; std::weak_ptr appMgrServiceInner_; diff --git a/services/appmgr/src/module_running_record.cpp b/services/appmgr/src/module_running_record.cpp index 29f2f8a2e13..509b0ec23a1 100644 --- a/services/appmgr/src/module_running_record.cpp +++ b/services/appmgr/src/module_running_record.cpp @@ -55,7 +55,7 @@ std::shared_ptr ModuleRunningRecord::GetAbilityRunningReco HILOG_ERROR("token is null"); return nullptr; } - std::shared_lock lock(abilitiesMutex_); + std::lock_guard lock(abilitiesMutex_); const auto &iter = abilities_.find(token); if (iter != abilities_.end()) { return iter->second; @@ -83,7 +83,7 @@ std::shared_ptr ModuleRunningRecord::AddAbility(const sptr if (want) { abilityRecord->SetOwnerUserId(want->GetIntParam(ABILITY_OWNER_USERID, -1)); } - std::unique_lock lock(abilitiesMutex_); + std::lock_guard lock(abilitiesMutex_); abilities_.emplace(token, abilityRecord); return abilityRecord; } @@ -94,14 +94,14 @@ bool ModuleRunningRecord::IsLastAbilityRecord(const sptr &token) HILOG_ERROR("token is nullptr"); return false; } - std::shared_lock lock(abilitiesMutex_); + std::lock_guard lock(abilitiesMutex_); return ((abilities_.size() == 1) && (abilities_.find(token) != abilities_.end())); } int32_t ModuleRunningRecord::GetPageAbilitySize() { int pageAbilitySize = 0; - std::shared_lock lock(abilitiesMutex_); + std::lock_guard lock(abilitiesMutex_); for (auto it : abilities_) { std::shared_ptr abilityRunningRecord = it.second; std::shared_ptr abilityInfo = abilityRunningRecord->GetAbilityInfo(); @@ -113,10 +113,10 @@ int32_t ModuleRunningRecord::GetPageAbilitySize() return pageAbilitySize; } -const std::map, std::shared_ptr> &ModuleRunningRecord::GetAbilities() +const std::map, std::shared_ptr> ModuleRunningRecord::GetAbilities() const { - std::shared_lock lock(abilitiesMutex_); + std::lock_guard lock(abilitiesMutex_); return abilities_; } @@ -127,7 +127,7 @@ std::shared_ptr ModuleRunningRecord::GetAbilityByTerminate HILOG_ERROR("GetAbilityByTerminateLists error, token is null"); return nullptr; } - std::shared_lock lock(abilitiesMutex_); + std::lock_guard lock(abilitiesMutex_); const auto &iter = terminateAbilities_.find(token); if (iter != terminateAbilities_.end()) { return iter->second; @@ -138,7 +138,7 @@ std::shared_ptr ModuleRunningRecord::GetAbilityByTerminate std::shared_ptr ModuleRunningRecord::GetAbilityRunningRecord(const int64_t eventId) const { HILOG_INFO("Get ability running record by eventId."); - std::shared_lock lock(abilitiesMutex_); + std::lock_guard lock(abilitiesMutex_); const auto &iter = std::find_if(abilities_.begin(), abilities_.end(), [eventId](const auto &pair) { return pair.second->GetEventId() == eventId; }); @@ -180,7 +180,7 @@ void ModuleRunningRecord::LaunchAbility(const std::shared_ptr lock(abilitiesMutex_); + std::lock_guard lock(abilitiesMutex_); const auto &iter = abilities_.find(ability->GetToken()); if (iter != abilities_.end() && appLifeCycleDeal_->GetApplicationClient()) { HILOG_INFO("Schedule launch ability, name is %{public}s.", ability->GetName().c_str()); @@ -194,7 +194,7 @@ void ModuleRunningRecord::LaunchAbility(const std::shared_ptr lock(abilitiesMutex_); + std::lock_guard lock(abilitiesMutex_); if (abilities_.empty()) { HILOG_ERROR("abilities_ is empty"); return; @@ -218,9 +218,11 @@ void ModuleRunningRecord::TerminateAbility(const std::shared_ptr lock(abilitiesMutex_); - terminateAbilities_.emplace(token, abilityRecord); - abilities_.erase(token); + { + std::lock_guard lock(abilitiesMutex_); + terminateAbilities_.emplace(token, abilityRecord); + abilities_.erase(token); + } if (!isForce) { auto curAbilityState = abilityRecord->GetState(); @@ -270,7 +272,7 @@ void ModuleRunningRecord::AbilityTerminated(const sptr &token) } if (RemoveTerminateAbilityTimeoutTask(token)) { - std::unique_lock lock(abilitiesMutex_); + std::lock_guard lock(abilitiesMutex_); terminateAbilities_.erase(token); } } -- Gitee