From d0d82ed83bb2a5e3b1552a1d98809868ee1a7417 Mon Sep 17 00:00:00 2001 From: wonghiu45 Date: Tue, 20 Sep 2022 21:47:00 +0800 Subject: [PATCH 1/2] adapt the foundation restart mechanism category: bugfix issue: #I5SB1E Signed-off-by: wonghiu45 --- .../include/event/mem_mgr_event_center.h | 9 +- .../memmgrservice/include/mem_mgr_service.h | 2 + .../reclaim_priority_manager.h | 1 + .../src/event/mem_mgr_event_center.cpp | 86 ++++++++++++++++--- .../memmgrservice/src/mem_mgr_service.cpp | 21 +++++ .../reclaim_priority_manager.cpp | 7 ++ 6 files changed, 113 insertions(+), 13 deletions(-) diff --git a/services/memmgrservice/include/event/mem_mgr_event_center.h b/services/memmgrservice/include/event/mem_mgr_event_center.h index 446fa1c..9e0de1a 100644 --- a/services/memmgrservice/include/event/mem_mgr_event_center.h +++ b/services/memmgrservice/include/event/mem_mgr_event_center.h @@ -38,7 +38,9 @@ class MemMgrEventCenter { public: ~MemMgrEventCenter(); bool Init(); - + void RetryRegisterEventObserver(); + void Dump(int fd); + void RemoveEventObserver(int32_t systemAbilityId); private: MemMgrEventCenter(); bool CreateRegisterHandler(); @@ -57,9 +59,10 @@ private: std::shared_ptr extConnObserver_; std::shared_ptr accountObserver_; std::shared_ptr commonEventObserver_; - BgTaskObserver bgTaskObserver_; - MemoryPressureObserver memoryPressureObserver_; + std::shared_ptr bgTaskObserver_; + std::shared_ptr memoryPressureObserver_; sptr appStateObserver_; + std::mutex totalEventCenterLock_; }; } // namespace Memory } // namespace OHOS diff --git a/services/memmgrservice/include/mem_mgr_service.h b/services/memmgrservice/include/mem_mgr_service.h index affbc94..c390fe4 100644 --- a/services/memmgrservice/include/mem_mgr_service.h +++ b/services/memmgrservice/include/mem_mgr_service.h @@ -31,6 +31,8 @@ public: ~MemMgrService() = default; virtual int32_t GetBundlePriorityList(BundlePriorityList &bundlePrioList) override; virtual int32_t NotifyDistDevStatus(int32_t pid, int32_t uid, const std::string &name, bool connected) override; + virtual void OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId) override; + virtual void OnRemoveSystemAbility(int32_t systemAbilityId, const std::string& deviceId) override; virtual int Dump(int fd, const std::vector &args) override; protected: diff --git a/services/memmgrservice/include/reclaim_priority_manager/reclaim_priority_manager.h b/services/memmgrservice/include/reclaim_priority_manager/reclaim_priority_manager.h index b32df08..6217bf8 100644 --- a/services/memmgrservice/include/reclaim_priority_manager/reclaim_priority_manager.h +++ b/services/memmgrservice/include/reclaim_priority_manager/reclaim_priority_manager.h @@ -107,6 +107,7 @@ public: void Dump(int fd); std::string& AppStateUpdateResonToString(AppStateUpdateReason reason); + void Reset(); private: bool initialized_ = false; diff --git a/services/memmgrservice/src/event/mem_mgr_event_center.cpp b/services/memmgrservice/src/event/mem_mgr_event_center.cpp index 8836825..1af79a5 100644 --- a/services/memmgrservice/src/event/mem_mgr_event_center.cpp +++ b/services/memmgrservice/src/event/mem_mgr_event_center.cpp @@ -56,21 +56,55 @@ bool MemMgrEventCenter::CreateRegisterHandler() return true; } -bool MemMgrEventCenter::RegisterEventObserver() +void MemMgrEventCenter::RemoveEventObserver(int32_t systemAbilityId) { HILOGI("called"); - RegisterMemoryPressureObserver(); + if (systemAbilityId == ABILITY_MGR_SERVICE_ID || systemAbilityId == APP_MGR_SERVICE_ID) { + appStateObserver_ = nullptr; + extConnObserver_ = nullptr; + ReclaimPriorityManager::GetInstance().Reset(); + } - RegisterAppStateObserver(); + if (systemAbilityId == BACKGROUND_TASK_MANAGER_SERVICE_ID) { + bgTaskObserver_ = nullptr; + } - RegisterExtConnObserver(); + if (systemAbilityId == SUBSYS_ACCOUNT_SYS_ABILITY_ID_BEGIN) { + accountObserver_ = nullptr; + } - RegisterBgTaskObserver(); + if (systemAbilityId == COMMON_EVENT_SERVICE_ID || systemAbilityId == COMMON_EVENT_SERVICE_ABILITY_ID) { + commonEventObserver_ = nullptr; + } +} - RegisterAccountObserver(); +bool MemMgrEventCenter::RegisterEventObserver() +{ + HILOGI("called"); + if (!memoryPressureObserver_) { + RegisterMemoryPressureObserver(); + } + + if (!appStateObserver_) { + RegisterAppStateObserver(); + } - RegisterCommonEventObserver(); + if (!extConnObserver_) { + RegisterExtConnObserver(); + } + + if (!bgTaskObserver_) { + RegisterBgTaskObserver(); + } + + if (!accountObserver_) { + RegisterAccountObserver(); + } + + if (!commonEventObserver_) { + RegisterCommonEventObserver(); + } return true; } @@ -119,7 +153,9 @@ void MemMgrEventCenter::RegisterExtConnObserver() void MemMgrEventCenter::RegisterBgTaskObserver() { HILOGI("called"); - ErrCode ret = BackgroundTaskMgr::BackgroundTaskMgrHelper::SubscribeBackgroundTask(bgTaskObserver_); + MAKE_POINTER(bgTaskObserver_, shared, BgTaskObserver, "make BgTaskObserver failed", + /* no return */, /* no param */); + ErrCode ret = BackgroundTaskMgr::BackgroundTaskMgrHelper::SubscribeBackgroundTask(*bgTaskObserver_); if (ret == ERR_OK) { HILOGI("register success"); return; @@ -173,7 +209,9 @@ void MemMgrEventCenter::RegisterAccountObserver() void MemMgrEventCenter::RegisterMemoryPressureObserver() { HILOGI("called"); - std::function initFunc = std::bind(&MemoryPressureObserver::Init, &memoryPressureObserver_); + MAKE_POINTER(memoryPressureObserver_, shared, MemoryPressureObserver, "make MemoryPressureObserver failed", + /* no return */, /* no param */); + std::function initFunc = std::bind(&MemoryPressureObserver::Init, memoryPressureObserver_); regObsHandler_->PostTask(initFunc, 10000, AppExecFwk::EventQueue::Priority::HIGH); // 10000 means 10s } @@ -184,7 +222,9 @@ MemMgrEventCenter::~MemMgrEventCenter() void MemMgrEventCenter::UnregisterEventObserver() { - BackgroundTaskMgr::BackgroundTaskMgrHelper::UnsubscribeBackgroundTask(bgTaskObserver_); + if (bgTaskObserver_) { + BackgroundTaskMgr::BackgroundTaskMgrHelper::UnsubscribeBackgroundTask(*bgTaskObserver_); + } if (accountObserver_) { AccountSA::OsAccountManager::UnsubscribeOsAccount(accountObserver_); } @@ -197,8 +237,34 @@ void MemMgrEventCenter::UnregisterEventObserver() } appMgrClient_ = nullptr; regObsHandler_ = nullptr; + bgTaskObserver_ = nullptr; extConnObserver_ = nullptr; accountObserver_ = nullptr; } + +void MemMgrEventCenter::Dump(int fd) +{ + std::lock_guard setLock(totalEventCenterLock_); + dprintf(fd, "state list of all observer\n"); + dprintf(fd, " name state \n"); + dprintf(fd, "%30s %8s\n", "MemoryPressureObserver", memoryPressureObserver_ == nullptr ? "N" : "Y"); + dprintf(fd, "-----------------------------------------------------------------\n"); + dprintf(fd, "%30s %8s\n", "AppStateObserver", appStateObserver_ == nullptr ? "N" : "Y"); + dprintf(fd, "-----------------------------------------------------------------\n"); + dprintf(fd, "%30s %8s\n", "ExtConnObserver", extConnObserver_ == nullptr ? "N" : "Y"); + dprintf(fd, "-----------------------------------------------------------------\n"); + dprintf(fd, "%30s %8s\n", "BgTaskObserver", bgTaskObserver_ == nullptr ? "N" : "Y"); + dprintf(fd, "-----------------------------------------------------------------\n"); + dprintf(fd, "%30s %8s\n", "AccountObserver", accountObserver_ == nullptr ? "N" : "Y"); + dprintf(fd, "-----------------------------------------------------------------\n"); + dprintf(fd, "%30s %8s\n", "CommonEventObserver", commonEventObserver_ == nullptr ? "N" : "Y"); + dprintf(fd, "-----------------------------------------------------------------\n"); +} + +void MemMgrEventCenter::RetryRegisterEventObserver() +{ + RegisterEventObserver(); +} + } // namespace Memory } // namespace OHOS diff --git a/services/memmgrservice/src/mem_mgr_service.cpp b/services/memmgrservice/src/mem_mgr_service.cpp index 06e1bd6..90a6681 100644 --- a/services/memmgrservice/src/mem_mgr_service.cpp +++ b/services/memmgrservice/src/mem_mgr_service.cpp @@ -81,6 +81,14 @@ void MemMgrService::OnStart() return; } HILOGI("publish SA successed"); + + AddSystemAbilityListener(COMMON_EVENT_SERVICE_ID); + AddSystemAbilityListener(COMMON_EVENT_SERVICE_ABILITY_ID); + AddSystemAbilityListener(BACKGROUND_TASK_MANAGER_SERVICE_ID); + AddSystemAbilityListener(SUBSYS_ACCOUNT_SYS_ABILITY_ID_BEGIN); + AddSystemAbilityListener(SUBSYS_APPLICATIONS_SYS_ABILITY_ID_BEGIN); + AddSystemAbilityListener(APP_MGR_SERVICE_ID); + AddSystemAbilityListener(ABILITY_MGR_SERVICE_ID); } void MemMgrService::OnStop() @@ -113,9 +121,22 @@ int32_t MemMgrService::NotifyDistDevStatus(int32_t pid, int32_t uid, const std:: return 0; } +void MemMgrService::OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId) +{ + HILOGI("systemAbilityId: %{public}d add", systemAbilityId); + MemMgrEventCenter::GetInstance().RetryRegisterEventObserver(); +} + +void MemMgrService::OnRemoveSystemAbility(int32_t systemAbilityId, const std::string& deviceId) +{ + HILOGI("systemAbilityId: %{public}d remove", systemAbilityId); + MemMgrEventCenter::GetInstance().RemoveEventObserver(systemAbilityId); +} + int MemMgrService::Dump(int fd, const std::vector &args) { HILOGI("called"); + MemMgrEventCenter::GetInstance().Dump(fd); ReclaimPriorityManager::GetInstance().Dump(fd); return 0; } diff --git a/services/memmgrservice/src/reclaim_priority_manager/reclaim_priority_manager.cpp b/services/memmgrservice/src/reclaim_priority_manager/reclaim_priority_manager.cpp index 8718071..9e7efec 100644 --- a/services/memmgrservice/src/reclaim_priority_manager/reclaim_priority_manager.cpp +++ b/services/memmgrservice/src/reclaim_priority_manager/reclaim_priority_manager.cpp @@ -812,5 +812,12 @@ bool ReclaimPriorityManager::UpdateAllPrioForOsAccountChanged(int accountId, bool ret = MultiAccountManager::GetInstance().HandleOsAccountsChanged(accountId, switchMod, osAccountsInfoMap_); return ret; } + +void ReclaimPriorityManager::Reset() +{ + totalBundlePrioSet_.clear(); + osAccountsInfoMap_.clear(); +} + } // namespace Memory } // namespace OHOS -- Gitee From f89fb52fd28ad28ab401dca1da2ae1b79ec3e79b Mon Sep 17 00:00:00 2001 From: wonghiu45 Date: Thu, 22 Sep 2022 14:39:33 +0800 Subject: [PATCH 2/2] update Signed-off-by: wonghiu45 Change-Id: I56b9eb6d129e3a50f57d435f8db2069c72b8f02f --- services/memmgrservice/include/event/mem_mgr_event_center.h | 1 - services/memmgrservice/src/event/mem_mgr_event_center.cpp | 1 - 2 files changed, 2 deletions(-) diff --git a/services/memmgrservice/include/event/mem_mgr_event_center.h b/services/memmgrservice/include/event/mem_mgr_event_center.h index 9e0de1a..1e65c37 100644 --- a/services/memmgrservice/include/event/mem_mgr_event_center.h +++ b/services/memmgrservice/include/event/mem_mgr_event_center.h @@ -62,7 +62,6 @@ private: std::shared_ptr bgTaskObserver_; std::shared_ptr memoryPressureObserver_; sptr appStateObserver_; - std::mutex totalEventCenterLock_; }; } // namespace Memory } // namespace OHOS diff --git a/services/memmgrservice/src/event/mem_mgr_event_center.cpp b/services/memmgrservice/src/event/mem_mgr_event_center.cpp index 1af79a5..0bc52b9 100644 --- a/services/memmgrservice/src/event/mem_mgr_event_center.cpp +++ b/services/memmgrservice/src/event/mem_mgr_event_center.cpp @@ -244,7 +244,6 @@ void MemMgrEventCenter::UnregisterEventObserver() void MemMgrEventCenter::Dump(int fd) { - std::lock_guard setLock(totalEventCenterLock_); dprintf(fd, "state list of all observer\n"); dprintf(fd, " name state \n"); dprintf(fd, "%30s %8s\n", "MemoryPressureObserver", memoryPressureObserver_ == nullptr ? "N" : "Y"); -- Gitee