From d863324153985bb25c21600c4ad4abb29f5233c8 Mon Sep 17 00:00:00 2001 From: chensi10 Date: Thu, 24 Jun 2021 17:38:56 +0800 Subject: [PATCH] add lock to kill application Signed-off-by: chensi10 --- .../appmgr/include/app_mgr_service_inner.h | 10 ------ services/appmgr/include/app_running_manager.h | 12 ++++--- services/appmgr/src/app_mgr_service_inner.cpp | 22 +++--------- services/appmgr/src/app_running_manager.cpp | 35 ++++++++++++++++--- 4 files changed, 42 insertions(+), 37 deletions(-) diff --git a/services/appmgr/include/app_mgr_service_inner.h b/services/appmgr/include/app_mgr_service_inner.h index 25532ad23e..34fa2621e2 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 b44e56cc71..3256022c0c 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 eb7f0b26ff..08007c9770 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 0863043f2e..527aa4a3fa 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(); } -- Gitee