diff --git a/services/appmgr/include/module_running_record.h b/services/appmgr/include/module_running_record.h index 9d5201c852374e5bdf3f277a0cabec563e714e2e..640ca1b58c283a765648e6a9694469222337de45 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" @@ -85,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; @@ -162,6 +163,7 @@ private: ModuleRecordState GetState() const; private: + 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 ab69fb3e6462f8e008cce7c98558f5778540b22e..509b0ec23a1fe3552981295b0444038e55246612 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::lock_guard 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::lock_guard 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::lock_guard lock(abilitiesMutex_); return ((abilities_.size() == 1) && (abilities_.find(token) != abilities_.end())); } int32_t ModuleRunningRecord::GetPageAbilitySize() { int pageAbilitySize = 0; + std::lock_guard lock(abilitiesMutex_); for (auto it : abilities_) { std::shared_ptr abilityRunningRecord = it.second; std::shared_ptr abilityInfo = abilityRunningRecord->GetAbilityInfo(); @@ -110,9 +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::lock_guard lock(abilitiesMutex_); return abilities_; } @@ -123,6 +127,7 @@ std::shared_ptr ModuleRunningRecord::GetAbilityByTerminate HILOG_ERROR("GetAbilityByTerminateLists error, token is null"); return nullptr; } + std::lock_guard 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::lock_guard 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,8 +218,11 @@ void ModuleRunningRecord::TerminateAbility(const std::shared_ptr lock(abilitiesMutex_); + terminateAbilities_.emplace(token, abilityRecord); + abilities_.erase(token); + } if (!isForce) { auto curAbilityState = abilityRecord->GetState(); @@ -262,6 +272,7 @@ void ModuleRunningRecord::AbilityTerminated(const sptr &token) } if (RemoveTerminateAbilityTimeoutTask(token)) { + std::lock_guard lock(abilitiesMutex_); terminateAbilities_.erase(token); } }