From fde7083c8883c07b17c68fcbeb1dff9420e4f152 Mon Sep 17 00:00:00 2001 From: yuwenze Date: Tue, 25 Apr 2023 08:17:56 +0000 Subject: [PATCH] fix acess mapp not in lock Signed-off-by: yuwenze Change-Id: Id1b213f64a7acf64431c03c54ff586dba2008c42 --- .../include/ability_connect_manager.h | 4 +- .../src/ability_connect_manager.cpp | 49 ++++++++++++------- 2 files changed, 34 insertions(+), 19 deletions(-) diff --git a/services/abilitymgr/include/ability_connect_manager.h b/services/abilitymgr/include/ability_connect_manager.h index 6ea168a59a1..d750750789e 100644 --- a/services/abilitymgr/include/ability_connect_manager.h +++ b/services/abilitymgr/include/ability_connect_manager.h @@ -224,10 +224,10 @@ public: */ void OnAbilityDied(const std::shared_ptr &abilityRecord, int32_t currentUserId); - void DumpState(std::vector &info, bool isClient, const std::string &args = "") const; + void DumpState(std::vector &info, bool isClient, const std::string &args = ""); void DumpStateByUri(std::vector &info, bool isClient, const std::string &args, - std::vector ¶ms) const; + std::vector ¶ms); void StopAllExtensions(); diff --git a/services/abilitymgr/src/ability_connect_manager.cpp b/services/abilitymgr/src/ability_connect_manager.cpp index 9ea2bdb7edb..03eaa0dbb69 100644 --- a/services/abilitymgr/src/ability_connect_manager.cpp +++ b/services/abilitymgr/src/ability_connect_manager.cpp @@ -1402,41 +1402,56 @@ void AbilityConnectManager::RestartAbility(const std::shared_ptr } } -void AbilityConnectManager::DumpState(std::vector &info, bool isClient, const std::string &args) const +void AbilityConnectManager::DumpState(std::vector &info, bool isClient, const std::string &args) { HILOG_INFO("DumpState args:%{public}s.", args.c_str()); + ServiceMapType serviceMapBack; + { + std::lock_guard guard(Lock_); + serviceMapBack = serviceMap_; + } if (!args.empty()) { - auto it = std::find_if(serviceMap_.begin(), serviceMap_.end(), [&args](const auto &service) { + auto it = std::find_if(serviceMapBack.begin(), serviceMapBack.end(), [&args](const auto &service) { return service.first.compare(args) == 0; }); - if (it != serviceMap_.end()) { + if (it != serviceMapBack.end()) { info.emplace_back("uri [ " + it->first + " ]"); - it->second->DumpService(info, isClient); + if (it->second != nullptr) { + it->second->DumpService(info, isClient); + } } else { info.emplace_back(args + ": Nothing to dump."); } } else { - auto abilityMgr = DelayedSingleton::GetInstance(); info.emplace_back(" ExtensionRecords:"); - for (auto &&service : serviceMap_) { + for (auto &&service : serviceMapBack) { info.emplace_back(" uri [" + service.first + "]"); - service.second->DumpService(info, isClient); + if (service.second != nullptr) { + service.second->DumpService(info, isClient); + } } } } void AbilityConnectManager::DumpStateByUri(std::vector &info, bool isClient, const std::string &args, - std::vector ¶ms) const + std::vector ¶ms) { - HILOG_INFO("DumpState args:%{public}s, params size: %{public}zu", args.c_str(), params.size()); - auto it = std::find_if(serviceMap_.begin(), serviceMap_.end(), [&args](const auto &service) { - return service.first.compare(args) == 0; - }); - if (it != serviceMap_.end()) { - info.emplace_back("uri [ " + it->first + " ]"); - it->second->DumpService(info, params, isClient); - } else { - info.emplace_back(args + ": Nothing to dump."); + HILOG_INFO("DumpStateByUri args:%{public}s, params size: %{public}zu", args.c_str(), params.size()); + std::shared_ptr extensionAbilityRecord = nullptr; + { + std::lock_guard guard(Lock_); + auto it = std::find_if(serviceMap_.begin(), serviceMap_.end(), [&args](const auto &service) { + return service.first.compare(args) == 0; + }); + if (it != serviceMap_.end()) { + info.emplace_back("uri [ " + it->first + " ]"); + extensionAbilityRecord = it->second; + } else { + info.emplace_back(args + ": Nothing to dump."); + } + } + if (extensionAbilityRecord != nullptr) { + extensionAbilityRecord->DumpService(info, params, isClient); } } -- Gitee