diff --git a/services/appmgr/include/app_mgr_service_inner.h b/services/appmgr/include/app_mgr_service_inner.h index 25532ad23ed854f61daa5eb11b5644ea35f4ad70..34fa2621e2dea61d120a8d296c214c95c6fb1754 100644 --- a/services/appmgr/include/app_mgr_service_inner.h +++ b/services/appmgr/include/app_mgr_service_inner.h @@ -558,16 +558,6 @@ private: */ bool WaitForRemoteProcessExit(std::list &pids, const int64_t startTime); - /** - * GetPidsByBundleName, Get the corresponding pid collection through the bundle name. - * - * @param bundleName, bundle name in Application record. - * @param pids, process number collection to exit. - * - * @return true, return back success,others fail. - */ - bool GetPidsByBundleName(const std::string &bundleName, std::list &pids); - /** * GetAllPids, Get the corresponding pid collection. * diff --git a/services/appmgr/include/app_running_manager.h b/services/appmgr/include/app_running_manager.h index b44e56cc71f51dd1869d161566eced74df008aeb..3256022c0c978047cc7d1c89191e609a78d2d9b3 100644 --- a/services/appmgr/include/app_running_manager.h +++ b/services/appmgr/include/app_running_manager.h @@ -58,7 +58,7 @@ public: * * @return process record. */ - std::shared_ptr GetAppRunningRecordByAppName(const std::string &appName) const; + std::shared_ptr GetAppRunningRecordByAppName(const std::string &appName); /** * GetAppRunningRecordByProcessName, Get process record by application name and process Name. @@ -69,7 +69,7 @@ public: * @return process record. */ std::shared_ptr GetAppRunningRecordByProcessName( - const std::string &appName, const std::string &processName) const; + const std::string &appName, const std::string &processName); /** * GetAppRunningRecordByPid, Get process record by application pid. @@ -78,7 +78,7 @@ public: * * @return process record. */ - std::shared_ptr GetAppRunningRecordByPid(const pid_t pid) const; + std::shared_ptr GetAppRunningRecordByPid(const pid_t pid); /** * GetAppRunningRecordByAbilityToken, Get process record by ability token. @@ -87,7 +87,7 @@ public: * * @return process record. */ - std::shared_ptr GetAppRunningRecordByAbilityToken(const sptr &abilityToken) const; + std::shared_ptr GetAppRunningRecordByAbilityToken(const sptr &abilityToken); /** * OnRemoteDied, Equipment death notification. @@ -102,7 +102,7 @@ public: * * @return the application record list. */ - const std::map> &GetAppRunningRecordMap() const; + const std::map> &GetAppRunningRecordMap(); /** * RemoveAppRunningRecordById, Remove application information through application id. @@ -119,8 +119,10 @@ public: */ void ClearAppRunningRecordMap(); + bool GetPidsByBundleName(const std::string &bundleName, std::list &pids); private: std::map> appRunningRecordMap_; + std::recursive_mutex lock_; }; } // namespace AppExecFwk diff --git a/services/appmgr/src/app_mgr_service_inner.cpp b/services/appmgr/src/app_mgr_service_inner.cpp index eb7f0b26ff8d4c54ba04dc51f24294625571aad4..08007c97700ef350c2fbe918239a09000dc5c880 100644 --- a/services/appmgr/src/app_mgr_service_inner.cpp +++ b/services/appmgr/src/app_mgr_service_inner.cpp @@ -207,10 +207,14 @@ void AppMgrServiceInner::ApplicationTerminated(const int32_t recordId) int32_t AppMgrServiceInner::KillApplication(const std::string &bundleName) { + if (!appRunningManager_) { + APP_LOGE("appRunningManager_ is nullptr"); + return ERR_NO_INIT; + } int result = ERR_OK; int64_t startTime = SystemTimeMillis(); std::list pids; - if (!GetPidsByBundleName(bundleName, pids)) { + if (!appRunningManager_->GetPidsByBundleName(bundleName, pids)) { APP_LOGI("The process corresponding to the package name did not start"); return result; } @@ -324,22 +328,6 @@ bool AppMgrServiceInner::WaitForRemoteProcessExit(std::list &pids, const return false; } -bool AppMgrServiceInner::GetPidsByBundleName(const std::string &bundleName, std::list &pids) -{ - for (const auto &item : appRunningManager_->GetAppRunningRecordMap()) { - const auto &appRecord = item.second; - if (appRecord->GetBundleName() == bundleName) { - pid_t pid = appRecord->GetPriorityObject()->GetPid(); - if (pid > 0) { - pids.push_back(pid); - appRecord->ScheduleProcessSecurityExit(); - } - } - } - - return (pids.empty() ? false : true); -} - bool AppMgrServiceInner::GetAllPids(std::list &pids) { for (const auto &appTaskInfo : appProcessManager_->GetRecentAppList()) { diff --git a/services/appmgr/src/app_running_manager.cpp b/services/appmgr/src/app_running_manager.cpp index 0863043f2ef31c5e741836b48aa294ce47fccdaa..527aa4a3fa36c44ac023bc2444422ae0ea728703 100644 --- a/services/appmgr/src/app_running_manager.cpp +++ b/services/appmgr/src/app_running_manager.cpp @@ -44,6 +44,7 @@ std::shared_ptr AppRunningManager::GetOrCreateAppRunningRecord const std::shared_ptr &appInfo, const std::shared_ptr &abilityInfo, const std::string &processName, const int32_t uid, RecordQueryResult &result) { + std::lock_guard guard(lock_); result.Reset(); if (!token || !appInfo || !abilityInfo) { APP_LOGE("param error"); @@ -81,8 +82,9 @@ std::shared_ptr AppRunningManager::GetOrCreateAppRunningRecord return record; } -std::shared_ptr AppRunningManager::GetAppRunningRecordByAppName(const std::string &appName) const +std::shared_ptr AppRunningManager::GetAppRunningRecordByAppName(const std::string &appName) { + std::lock_guard guard(lock_); auto iter = std::find_if(appRunningRecordMap_.begin(), appRunningRecordMap_.end(), [&appName](const auto &pair) { return pair.second->GetName() == appName; }); @@ -90,8 +92,9 @@ std::shared_ptr AppRunningManager::GetAppRunningRecordByAppNam } std::shared_ptr AppRunningManager::GetAppRunningRecordByProcessName( - const std::string &appName, const std::string &processName) const + const std::string &appName, const std::string &processName) { + std::lock_guard guard(lock_); auto iter = std::find_if( appRunningRecordMap_.begin(), appRunningRecordMap_.end(), [&appName, &processName](const auto &pair) { return ((pair.second->GetName() == appName) && (pair.second->GetProcessName() == processName)); @@ -99,8 +102,9 @@ std::shared_ptr AppRunningManager::GetAppRunningRecordByProces return ((iter == appRunningRecordMap_.end()) ? nullptr : iter->second); } -std::shared_ptr AppRunningManager::GetAppRunningRecordByPid(const pid_t pid) const +std::shared_ptr AppRunningManager::GetAppRunningRecordByPid(const pid_t pid) { + std::lock_guard guard(lock_); auto iter = std::find_if(appRunningRecordMap_.begin(), appRunningRecordMap_.end(), [&pid](const auto &pair) { return pair.second->GetPriorityObject()->GetPid() == pid; }); @@ -108,8 +112,9 @@ std::shared_ptr AppRunningManager::GetAppRunningRecordByPid(co } std::shared_ptr AppRunningManager::GetAppRunningRecordByAbilityToken( - const sptr &abilityToken) const + const sptr &abilityToken) { + std::lock_guard guard(lock_); for (const auto &item : appRunningRecordMap_) { const auto &appRecord = item.second; if (appRecord && appRecord->GetAbilityRunningRecordByToken(abilityToken)) { @@ -119,8 +124,26 @@ std::shared_ptr AppRunningManager::GetAppRunningRecordByAbilit return nullptr; } +bool AppRunningManager::GetPidsByBundleName(const std::string &bundleName, std::list &pids) +{ + std::lock_guard guard(lock_); + for (const auto &item : appRunningRecordMap_) { + const auto &appRecord = item.second; + if (appRecord && appRecord->GetBundleName() == bundleName) { + pid_t pid = appRecord->GetPriorityObject()->GetPid(); + if (pid > 0) { + pids.push_back(pid); + appRecord->ScheduleProcessSecurityExit(); + } + } + } + + return (pids.empty() ? false : true); +} + std::shared_ptr AppRunningManager::OnRemoteDied(const wptr &remote) { + std::lock_guard guard(lock_); if (remote == nullptr) { APP_LOGE("remote is null"); return nullptr; @@ -148,18 +171,20 @@ std::shared_ptr AppRunningManager::OnRemoteDied(const wptr> &AppRunningManager::GetAppRunningRecordMap() - const { + std::lock_guard guard(lock_); return appRunningRecordMap_; } void AppRunningManager::RemoveAppRunningRecordById(const int32_t recordId) { + std::lock_guard guard(lock_); appRunningRecordMap_.erase(recordId); } void AppRunningManager::ClearAppRunningRecordMap() { + std::lock_guard guard(lock_); appRunningRecordMap_.clear(); }