diff --git a/services/memmgrservice/include/event/mem_mgr_event_center.h b/services/memmgrservice/include/event/mem_mgr_event_center.h index 446fa1c2b47648cf0caf98f1a980653c95385e3c..1e65c37c252b50fdd0a27cead45e5f0f91e3bdfb 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,8 +59,8 @@ 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_; }; } // namespace Memory diff --git a/services/memmgrservice/include/mem_mgr_service.h b/services/memmgrservice/include/mem_mgr_service.h index affbc94896bcd34c340890a0210446ed530232a8..c390fe4d33d0068647960a7e9016de8f1e7f3540 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 b32df085ef3bb23d9c8aa957b044ec2caab1dd57..6217bf8a42e6228f0082ec998dd7a8ac8976173b 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 8836825237676871be82ffc52a73824e3324d917..0bc52b9442ceb602c48bf77b62886f22939ecb4e 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,33 @@ void MemMgrEventCenter::UnregisterEventObserver() } appMgrClient_ = nullptr; regObsHandler_ = nullptr; + bgTaskObserver_ = nullptr; extConnObserver_ = nullptr; accountObserver_ = nullptr; } + +void MemMgrEventCenter::Dump(int fd) +{ + 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 06e1bd67bfc548c2026f2be0e581458247cbea28..90a66817cbcd263b60bbe31502aa9a1246c8b8ea 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 8718071df7f4ae632d19922a93646dc1e14c73c7..9e7efecd0705f16e53e2d6067912a5a2c79c3486 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