• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "mem_mgr_event_center.h"
17 #include <string>
18 #include "memmgr_log.h"
19 #include "memmgr_ptr_util.h"
20 #include "common_event_observer.h"
21 #include "reclaim_priority_manager.h"
22 #include "window_visibility_observer.h"
23 #ifdef CONFIG_BGTASK_MGR
24 #include "background_task_mgr_helper.h"
25 #endif
26 #include "connection_observer_client.h"
27 #include "common_event_support.h"
28 #include "common_event_manager.h"
29 
30 namespace OHOS {
31 namespace Memory {
32 namespace {
33 const std::string TAG = "MemMgrEventCenter";
34 const std::string MEMMGR_CENTER_HANDLER = "MemMgrEventCenterHandler";
35 const int ACCOUNT_MAX_RETRY_TIMES = 10;
36 const int ACCOUNT_RETRY_DELAY = 3000;
37 const int EXTCONN_RETRY_TIME = 1000;
38 }
39 
40 IMPLEMENT_SINGLE_INSTANCE(MemMgrEventCenter);
41 
MemMgrEventCenter()42 MemMgrEventCenter::MemMgrEventCenter()
43 {}
44 
Init()45 bool MemMgrEventCenter::Init()
46 {
47     HILOGI("called");
48     if (CreateRegisterHandler()) {
49         HandlerRegisterEvent(RegisterEvent::REG_ALLOBS_EVENT);
50         return true;
51     }
52     return false;
53 }
54 
CreateRegisterHandler()55 bool MemMgrEventCenter::CreateRegisterHandler()
56 {
57     if (!regObsHandler_) {
58         MAKE_POINTER(regObsHandler_, shared, AppExecFwk::EventHandler, "failed to create register handler",
59         return false, AppExecFwk::EventRunner::Create(MEMMGR_CENTER_HANDLER));
60     }
61     return true;
62 }
63 
RemoveEventObserver(int32_t systemAbilityId)64 void MemMgrEventCenter::RemoveEventObserver(int32_t systemAbilityId)
65 {
66     HILOGI("called");
67     if (systemAbilityId == ABILITY_MGR_SERVICE_ID || systemAbilityId == APP_MGR_SERVICE_ID) {
68         ReclaimPriorityManager::GetInstance().Reset();
69     }
70 }
71 
OnProcessDied(int pid)72 void MemMgrEventCenter::OnProcessDied(int pid)
73 {
74     HILOGD("called");
75     WindowVisibilityObserver::GetInstance().OnProcessDied(pid);
76 }
77 
RegisterEventObserver()78 bool MemMgrEventCenter::RegisterEventObserver()
79 {
80     HILOGI("called");
81     if (!memoryPressureObserver_) {
82         RegisterMemoryPressureObserver();
83     }
84 
85 #ifdef USE_PURGEABLE_MEMORY
86     if (!kswapdObserver_) {
87         RegisterKswapdObserver();
88     }
89 #endif
90 
91     if (!appStateObserver_) {
92         RegisterAppStateObserver();
93     }
94 
95     if (!extConnObserver_) {
96         RegisterExtConnObserver();
97     }
98 
99     if (!accountObserver_) {
100         RegisterAccountObserver();
101     }
102 
103     if (!commonEventObserver_) {
104         RegisterCommonEventObserver();
105     }
106 
107 #ifdef CONFIG_BGTASK_MGR
108     if (!bgTaskObserver_) {
109         RegisterBgTaskObserver();
110     }
111 #endif
112     return true;
113 }
114 
HandlerRegisterEvent(int64_t registerEventId)115 void MemMgrEventCenter::HandlerRegisterEvent(int64_t registerEventId)
116 {
117     if (registerEventId == RegisterEvent::REG_ALLOBS_EVENT) {
118         std::function<void()> RegisterEventObserverFunc =
119                                 std::bind(&MemMgrEventCenter::RegisterEventObserver, this);
120         regObsHandler_->PostImmediateTask(RegisterEventObserverFunc);
121     } else if (registerEventId == RegisterEvent::REG_MEMPRESSOBS_EVENT) {
122         std::function<void()> RegisterMemoryPressureObserverFunc =
123                                 std::bind(&MemMgrEventCenter::RegisterMemoryPressureObserver, this);
124         regObsHandler_->PostImmediateTask(RegisterMemoryPressureObserverFunc);
125     } else if (registerEventId == RegisterEvent::REG_APPOBS_EVENT) {
126         std::function<void()> RegisterAppStateObserverFunc =
127                                 std::bind(&MemMgrEventCenter::RegisterAppStateObserver, this);
128         regObsHandler_->PostImmediateTask(RegisterAppStateObserverFunc);
129     } else if (registerEventId == RegisterEvent::REG_EXTOBS_EVENT) {
130         std::function<void()> RegisterExtConnObserverFunc =
131                                 std::bind(&MemMgrEventCenter::RegisterExtConnObserver, this);
132         regObsHandler_->PostImmediateTask(RegisterExtConnObserverFunc);
133     } else if (registerEventId == RegisterEvent::REG_ACCOUNTOBS_EVENT) {
134         std::function<void()> RegisterAccountObserverFunc =
135                                 std::bind(&MemMgrEventCenter::RegisterAccountObserver, this);
136         regObsHandler_->PostImmediateTask(RegisterAccountObserverFunc);
137     } else if (registerEventId == RegisterEvent::REG_COMMONOBS_EVENT) {
138         std::function<void()> RegisterCommonEventObserverFunc =
139                                 std::bind(&MemMgrEventCenter::RegisterCommonEventObserver, this);
140         regObsHandler_->PostImmediateTask(RegisterCommonEventObserverFunc);
141     } else if (registerEventId == RegisterEvent::REG_BGTASKOBS_EVENT) {
142         #ifdef CONFIG_BGTASK_MGR
143             {
144                 std::function<void()> RegisterBgTaskObserverFunc =
145                                     std::bind(&MemMgrEventCenter::RegisterBgTaskObserver, this);
146                 regObsHandler_->PostImmediateTask(RegisterBgTaskObserverFunc);
147             }
148         #endif
149     }
150     return;
151 }
152 
RegisterAppStateObserver()153 void MemMgrEventCenter::RegisterAppStateObserver()
154 {
155     HILOGI("called");
156     MAKE_POINTER(appMgrClient_, unique, AppExecFwk::AppMgrClient, "make appMgrClient failed",
157          return, /* no param */);
158     appStateObserver_ = new (std::nothrow) AppStateObserver();
159     while (appMgrClient_->ConnectAppMgrService() != AppExecFwk::AppMgrResultCode::RESULT_OK) {
160         HILOGE("ConnectAppMgrService fail, try again! retryTimes=%{public}d", ++regAppStatusObsRetry_);
161     }
162     auto systemAbilityManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
163     sptr<AppExecFwk::IAppMgr> appObject =
164         iface_cast<AppExecFwk::IAppMgr>(systemAbilityManager->GetSystemAbility(APP_MGR_SERVICE_ID));
165     if (appObject) {
166         int ret = appObject->RegisterApplicationStateObserver(appStateObserver_);
167         if (ret == ERR_OK) {
168             HILOGI("register success");
169             return;
170         }
171         HILOGE("register fail, ret = %{public}d", ret);
172         return;
173     }
174     HILOGE("get SystemAbilityManager fail");
175 }
176 
RegisterExtConnObserver()177 void MemMgrEventCenter::RegisterExtConnObserver()
178 {
179     HILOGI("called");
180     MAKE_POINTER(extConnObserver_, shared, ExtensionConnectionObserver, "make ExtensionConnectionObserver failed",
181         /* no return */, /* no param */);
182     if (extConnObserver_ != nullptr) {
183         int32_t ret = AbilityRuntime::ConnectionObserverClient::GetInstance().RegisterObserver(extConnObserver_);
184         if (ret == ERR_OK) {
185             HILOGI("register success");
186             return;
187         }
188         HILOGE("register fail, ret = %{public}d", ret);
189     }
190     std::function<void()> RegisterExtConnObserverFunc = std::bind(&MemMgrEventCenter::RegisterExtConnObserver, this);
191     regObsHandler_->PostTask(RegisterExtConnObserverFunc, EXTCONN_RETRY_TIME, AppExecFwk::EventQueue::Priority::LOW);
192 }
193 
RegisterBgTaskObserver()194 void MemMgrEventCenter::RegisterBgTaskObserver()
195 {
196     HILOGI("called");
197 #ifdef CONFIG_BGTASK_MGR
198     if (bgTaskObserver_) {
199         return;
200     }
201     MAKE_POINTER(bgTaskObserver_, shared, BgTaskObserver, "make BgTaskObserver failed",
202             return, /* no param */);
203     ErrCode ret = BackgroundTaskMgr::BackgroundTaskMgrHelper::SubscribeBackgroundTask(*bgTaskObserver_);
204     if (ret == ERR_OK) {
205         HILOGI("register success");
206         return;
207     }
208     HILOGE("register fail, ret = %{public}d", ret);
209 #else
210     HILOGI("BackgroundTaskMgr is not enable.");
211 #endif
212 }
213 
RegisterCommonEventObserver()214 void MemMgrEventCenter::RegisterCommonEventObserver()
215 {
216     HILOGI("called");
217     EventFwk::MatchingSkills matchingSkills;
218     matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_BOOT_COMPLETED);
219     matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_POWER_CONNECTED);
220     matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_POWER_DISCONNECTED);
221     matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_ON);
222     matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_OFF);
223     EventFwk::CommonEventSubscribeInfo commonEventSubscribeInfo(matchingSkills);
224     MAKE_POINTER(commonEventObserver_, shared, CommonEventObserver, "make unique failed",
225         return, commonEventSubscribeInfo);
226     if (EventFwk::CommonEventManager::SubscribeCommonEvent(commonEventObserver_)) {
227         HILOGI("register success");
228         return;
229     }
230     HILOGI("register fail");
231 }
232 
RegisterAccountObserver()233 void MemMgrEventCenter::RegisterAccountObserver()
234 {
235     HILOGI("called");
236     regAccountObsRetry_++;
237     AccountSA::OsAccountSubscribeInfo osAccountSubscribeInfo;
238     osAccountSubscribeInfo.SetOsAccountSubscribeType(AccountSA::OS_ACCOUNT_SUBSCRIBE_TYPE::ACTIVED);
239     osAccountSubscribeInfo.SetName("MemMgrAccountActivedSubscriber");
240     MAKE_POINTER(accountObserver_, shared, AccountObserver, "make unique failed", return, osAccountSubscribeInfo);
241     ErrCode errCode = AccountSA::OsAccountManager::SubscribeOsAccount(accountObserver_);
242     if (errCode == ERR_OK) {
243         HILOGI("register success");
244         return;
245     }
246 
247     if (regAccountObsRetry_ < ACCOUNT_MAX_RETRY_TIMES) {
248         std::function<void()> RegisterAccountObserverFunc =
249             std::bind(&MemMgrEventCenter::RegisterAccountObserver, this);
250         HILOGE("register fail, retCode = %{public}d, try again after 3s!, retryTimes=%{public}d/10",
251             errCode, regAccountObsRetry_);
252         regObsHandler_->PostTask(RegisterAccountObserverFunc, ACCOUNT_RETRY_DELAY,
253             AppExecFwk::EventQueue::Priority::LOW); // 3000 means 3s
254     }
255 }
256 
RegisterMemoryPressureObserver()257 void MemMgrEventCenter::RegisterMemoryPressureObserver()
258 {
259     HILOGI("called");
260     MAKE_POINTER(memoryPressureObserver_, shared, MemoryPressureObserver, "make MemoryPressureObserver failed", return,
261                  /* no param */);
262     std::function<void()> initFunc = std::bind(&MemoryPressureObserver::Init, memoryPressureObserver_);
263     regObsHandler_->PostTask(initFunc, 10000, AppExecFwk::EventQueue::Priority::HIGH); // 10000 means 10s
264 }
265 
RegisterKswapdObserver()266 void MemMgrEventCenter::RegisterKswapdObserver()
267 {
268     HILOGI("called");
269     MAKE_POINTER(kswapdObserver_, shared, KswapdObserver, "make KswapdObserver failed", return, /* no param */);
270     std::function<void()> initFunc = std::bind(&KswapdObserver::Init, kswapdObserver_);
271     regObsHandler_->PostTask(initFunc, 10000, AppExecFwk::EventQueue::Priority::HIGH); // 10000 means 10s
272 }
273 
~MemMgrEventCenter()274 MemMgrEventCenter::~MemMgrEventCenter()
275 {
276     HILOGI("called");
277     UnregisterEventObserver();
278 }
279 
UnregisterEventObserver()280 void MemMgrEventCenter::UnregisterEventObserver()
281 {
282 #ifdef CONFIG_BGTASK_MGR
283     if (bgTaskObserver_) {
284         BackgroundTaskMgr::BackgroundTaskMgrHelper::UnsubscribeBackgroundTask(*bgTaskObserver_);
285     }
286     bgTaskObserver_ = nullptr;
287 #endif
288     if (accountObserver_) {
289         AccountSA::OsAccountManager::UnsubscribeOsAccount(accountObserver_);
290     }
291     if (commonEventObserver_) {
292         EventFwk::CommonEventManager::UnSubscribeCommonEvent(commonEventObserver_);
293     }
294     if (appStateObserver_) {
295         delete appStateObserver_;
296         appStateObserver_ = nullptr;
297     }
298     appMgrClient_ = nullptr;
299     regObsHandler_ = nullptr;
300     extConnObserver_ = nullptr;
301     accountObserver_ = nullptr;
302 }
303 
Dump(int fd)304 void MemMgrEventCenter::Dump(int fd)
305 {
306     dprintf(fd, "state list of all observer\n");
307     dprintf(fd, "                 name               state \n");
308     dprintf(fd, "%30s %8s\n", "MemoryPressureObserver", memoryPressureObserver_ == nullptr ? "N" : "Y");
309     dprintf(fd, "-----------------------------------------------------------------\n");
310     dprintf(fd, "%30s %8s\n", "KswapdObserver", kswapdObserver_ == nullptr ? "N" : "Y");
311     dprintf(fd, "-----------------------------------------------------------------\n");
312     dprintf(fd, "%30s %8s\n", "AppStateObserver", appStateObserver_ == nullptr ? "N" : "Y");
313     dprintf(fd, "-----------------------------------------------------------------\n");
314     dprintf(fd, "%30s %8s\n", "ExtConnObserver", extConnObserver_ == nullptr ? "N" : "Y");
315     dprintf(fd, "-----------------------------------------------------------------\n");
316 #ifdef CONFIG_BGTASK_MGR
317     dprintf(fd, "%30s %8s\n", "BgTaskObserver", bgTaskObserver_ == nullptr ? "N" : "Y");
318     dprintf(fd, "-----------------------------------------------------------------\n");
319 #endif
320     dprintf(fd, "%30s %8s\n", "AccountObserver", accountObserver_ == nullptr ? "N" : "Y");
321     dprintf(fd, "-----------------------------------------------------------------\n");
322     dprintf(fd, "%30s %8s\n", "CommonEventObserver", commonEventObserver_ == nullptr ? "N" : "Y");
323     dprintf(fd, "-----------------------------------------------------------------\n");
324 }
325 
RetryRegisterEventObserver(int32_t systemAbilityId)326 void MemMgrEventCenter::RetryRegisterEventObserver(int32_t systemAbilityId)
327 {
328 #ifdef CONFIG_BGTASK_MGR
329     if (systemAbilityId == BACKGROUND_TASK_MANAGER_SERVICE_ID) {
330         HandlerRegisterEvent(RegisterEvent::REG_BGTASKOBS_EVENT);
331     }
332 #endif
333     if (systemAbilityId == ABILITY_MGR_SERVICE_ID || systemAbilityId == APP_MGR_SERVICE_ID) {
334         HandlerRegisterEvent(RegisterEvent::REG_APPOBS_EVENT);
335     }
336 
337     if (systemAbilityId == SUBSYS_ACCOUNT_SYS_ABILITY_ID_BEGIN) {
338         HandlerRegisterEvent(RegisterEvent::REG_ACCOUNTOBS_EVENT);
339     }
340 
341     if (systemAbilityId == COMMON_EVENT_SERVICE_ID || systemAbilityId == COMMON_EVENT_SERVICE_ABILITY_ID) {
342         HandlerRegisterEvent(RegisterEvent::REG_COMMONOBS_EVENT);
343     }
344 }
345 
346 } // namespace Memory
347 } // namespace OHOS
348