1 /*
2 * Copyright (c) 2023 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 <algorithm>
17
18 #include "ability_death_recipient.h"
19 #include "datetime_ex.h"
20 #include "ipc_skeleton.h"
21 #include "memory_guard.h"
22 #include "sam_log.h"
23 #include "hisysevent_adapter.h"
24 #include "schedule/system_ability_state_scheduler.h"
25 #include "service_control.h"
26 #include "samgr_err_code.h"
27 #include "string_ex.h"
28 #include "system_ability_manager.h"
29 #include "samgr_xcollie.h"
30 #include "parameters.h"
31 #include "system_ability_manager_util.h"
32 #include "system_ability_definition.h"
33
34 namespace OHOS {
35 namespace {
36 constexpr int64_t RESTART_TIME_INTERVAL_LIMIT = 20 * 1000;
37 constexpr int32_t RESTART_TIMES_LIMIT = 4;
38 constexpr int32_t MAX_SUBSCRIBE_COUNT = 256;
39 constexpr int32_t UNLOAD_TIMEOUT_TIME = 5 * 1000;
40 constexpr const char* LOCAL_DEVICE = "local";
41 constexpr int32_t MAX_DELAY_TIME = 5 * 60 * 1000;
42 constexpr int32_t MAX_DURATION = 10 * 60 * 1000; // ms
43 constexpr int32_t ONCE_DELAY_TIME = 10 * 1000; // ms
44 constexpr const char* CANCEL_UNLOAD = "cancelUnload";
45 constexpr const char* KEY_EVENT_ID = "eventId";
46 constexpr const char* KEY_NAME = "name";
47 constexpr const char* KEY_VALUE = "value";
48 constexpr const char* KEY_EXTRA_DATA_ID = "extraDataId";
49 constexpr const char* KEY_UNLOAD_TIMEOUT = "unloadTimeout";
50 const std::u16string SAMGR_PROCESS_NAME = u"samgr";
51 constexpr const char *SA_STATE_ENUM_STR[] = {
52 "NOT_LOADED", "LOADING", "LOADED", "UNLOADABLE", "UNLOADING" };
53 constexpr const char *PROCESS_STATE_ENUM_STR[] = {
54 "NOT_STARTED", "STARTED", "STOPPING" };
55 constexpr const char *PENDINGEVENT_ENUM_STR[] = {
56 "NO_EVENT", "LOAD_ABILITY_EVENT", "UNLOAD_ABILITY_EVENT" };
57 }
Init(const std::list<SaProfile> & saProfiles)58 void SystemAbilityStateScheduler::Init(const std::list<SaProfile>& saProfiles)
59 {
60 HILOGI("Scheduler:init start");
61 InitStateContext(saProfiles);
62 processListenerDeath_ = sptr<IRemoteObject::DeathRecipient>(new SystemProcessListenerDeathRecipient());
63 unloadEventHandler_ = std::make_shared<UnloadEventHandler>(weak_from_this());
64
65 auto listener = std::dynamic_pointer_cast<SystemAbilityStateListener>(shared_from_this());
66 stateMachine_ = std::make_shared<SystemAbilityStateMachine>(listener);
67 stateEventHandler_ = std::make_shared<SystemAbilityEventHandler>(stateMachine_);
68
69 processHandler_ = std::make_shared<FFRTHandler>("ProcessHandler");
70 HILOGI("Scheduler:init end");
71 }
72
CleanFfrt()73 void SystemAbilityStateScheduler::CleanFfrt()
74 {
75 if (processHandler_ != nullptr) {
76 processHandler_->CleanFfrt();
77 }
78 if (unloadEventHandler_ != nullptr) {
79 unloadEventHandler_->CleanFfrt();
80 }
81 }
82
SetFfrt()83 void SystemAbilityStateScheduler::SetFfrt()
84 {
85 if (processHandler_ != nullptr) {
86 processHandler_->SetFfrt("ProcessHandler");
87 }
88 if (unloadEventHandler_ != nullptr) {
89 unloadEventHandler_->SetFfrt();
90 }
91 }
92
InitStateContext(const std::list<SaProfile> & saProfiles)93 void SystemAbilityStateScheduler::InitStateContext(const std::list<SaProfile>& saProfiles)
94 {
95 for (auto& saProfile : saProfiles) {
96 if (saProfile.process.empty()) {
97 continue;
98 }
99 std::unique_lock<std::shared_mutex> processWriteLock(processMapLock_);
100 if (processContextMap_.count(saProfile.process) == 0) {
101 auto processContext = std::make_shared<SystemProcessContext>();
102 processContext->processName = saProfile.process;
103 processContext->abilityStateCountMap[SystemAbilityState::NOT_LOADED] = 0;
104 processContext->abilityStateCountMap[SystemAbilityState::LOADING] = 0;
105 processContext->abilityStateCountMap[SystemAbilityState::LOADED] = 0;
106 processContext->abilityStateCountMap[SystemAbilityState::UNLOADABLE] = 0;
107 processContext->abilityStateCountMap[SystemAbilityState::UNLOADING] = 0;
108 processContextMap_[saProfile.process] = processContext;
109 }
110 processContextMap_[saProfile.process]->saList.push_back(saProfile.saId);
111 processContextMap_[saProfile.process]->abilityStateCountMap[SystemAbilityState::NOT_LOADED]++;
112 auto abilityContext = std::make_shared<SystemAbilityContext>();
113 abilityContext->systemAbilityId = saProfile.saId;
114 abilityContext->isAutoRestart = saProfile.autoRestart;
115 int32_t delayUnloadTime = LimitDelayUnloadTime(saProfile.stopOnDemand.delayTime);
116 abilityContext->delayUnloadTime = delayUnloadTime;
117 abilityContext->ownProcessContext = processContextMap_[saProfile.process];
118 std::unique_lock<std::shared_mutex> abiltyWriteLock(abiltyMapLock_);
119 abilityContextMap_[saProfile.saId] = abilityContext;
120 }
121 }
122
InitSamgrProcessContext()123 void SystemAbilityStateScheduler::InitSamgrProcessContext()
124 {
125 auto processContext = std::make_shared<SystemProcessContext>();
126 processContext->processName = SAMGR_PROCESS_NAME;
127 processContext->abilityStateCountMap[SystemAbilityState::NOT_LOADED] = 0;
128 processContext->abilityStateCountMap[SystemAbilityState::LOADING] = 0;
129 processContext->abilityStateCountMap[SystemAbilityState::LOADED] = 1;
130 processContext->abilityStateCountMap[SystemAbilityState::UNLOADABLE] = 0;
131 processContext->abilityStateCountMap[SystemAbilityState::UNLOADING] = 0;
132 processContext->pid = getpid();
133 processContext->uid = static_cast<int32_t>(getuid());
134 processContextMap_[SAMGR_PROCESS_NAME] = processContext;
135 processContextMap_[SAMGR_PROCESS_NAME]->saList.push_back(0);
136 processContext->state = SystemProcessState::STARTED;
137
138 auto abilityContext = std::make_shared<SystemAbilityContext>();
139 abilityContext->systemAbilityId = 0;
140 abilityContext->isAutoRestart = false;
141 abilityContext->delayUnloadTime = MAX_DELAY_TIME;
142 abilityContext->ownProcessContext = processContextMap_[SAMGR_PROCESS_NAME];
143 std::unique_lock<std::shared_mutex> abiltyWriteLock(abiltyMapLock_);
144 abilityContextMap_[0] = abilityContext;
145 }
146
LimitDelayUnloadTime(int32_t delayUnloadTime)147 int32_t SystemAbilityStateScheduler::LimitDelayUnloadTime(int32_t delayUnloadTime)
148 {
149 if (delayUnloadTime < 0) {
150 return 0;
151 }
152 if (delayUnloadTime > MAX_DELAY_TIME) {
153 return MAX_DELAY_TIME;
154 }
155 return delayUnloadTime;
156 }
157
GetSystemAbilityContext(int32_t systemAbilityId,std::shared_ptr<SystemAbilityContext> & abilityContext)158 bool SystemAbilityStateScheduler::GetSystemAbilityContext(int32_t systemAbilityId,
159 std::shared_ptr<SystemAbilityContext>& abilityContext)
160 {
161 std::shared_lock<std::shared_mutex> readLock(abiltyMapLock_);
162 if (abilityContextMap_.count(systemAbilityId) == 0) {
163 HILOGD("Scheduler SA:%{public}d not in SA profiles", systemAbilityId);
164 return false;
165 }
166 abilityContext = abilityContextMap_[systemAbilityId];
167 if (abilityContext == nullptr) {
168 HILOGE("Scheduler SA:%{public}d context is null", systemAbilityId);
169 return false;
170 }
171 if (abilityContext->ownProcessContext == nullptr) {
172 HILOGE("Scheduler SA:%{public}d not in any proc", systemAbilityId);
173 return false;
174 }
175 return true;
176 }
177
UpdateLimitDelayUnloadTime(int32_t systemAbilityId)178 void SystemAbilityStateScheduler::UpdateLimitDelayUnloadTime(int32_t systemAbilityId)
179 {
180 if (processHandler_ == nullptr) {
181 HILOGE("UpdateLimitDelayUnloadTime process handler not init");
182 return;
183 }
184 auto updateDelayUnloadTimeTask = [systemAbilityId, this]() {
185 UpdateLimitDelayUnloadTimeTask(systemAbilityId);
186 };
187 bool ret = processHandler_->PostTask(updateDelayUnloadTimeTask);
188 if (!ret) {
189 HILOGW("UpdateLimitDelayUnloadTime PostTask fail");
190 }
191 }
192
UpdateLimitDelayUnloadTimeTask(int32_t systemAbilityId)193 void SystemAbilityStateScheduler::UpdateLimitDelayUnloadTimeTask(int32_t systemAbilityId)
194 {
195 std::shared_ptr<SystemAbilityContext> abilityContext;
196 if (!GetSystemAbilityContext(systemAbilityId, abilityContext)) {
197 return;
198 }
199 std::lock_guard<std::mutex> autoLock(abilityContext->ownProcessContext->processLock);
200 if (abilityContext->lastStartTime != 0) {
201 int64_t begin = abilityContext->lastStartTime;
202 int64_t end = GetTickCount();
203 if (end - begin <= MAX_DURATION) {
204 int64_t onceDelayTime = abilityContext->delayUnloadTime;
205 onceDelayTime += ONCE_DELAY_TIME;
206 abilityContext->delayUnloadTime = LimitDelayUnloadTime(onceDelayTime);
207 HILOGI("DelayUnloadTime is %{public}d, SA:%{public}d",
208 abilityContext->delayUnloadTime, systemAbilityId);
209 }
210 }
211 abilityContext->lastStartTime = GetTickCount();
212 }
213
GetSystemProcessContext(const std::u16string & processName,std::shared_ptr<SystemProcessContext> & processContext)214 bool SystemAbilityStateScheduler::GetSystemProcessContext(const std::u16string& processName,
215 std::shared_ptr<SystemProcessContext>& processContext)
216 {
217 std::shared_lock<std::shared_mutex> readLock(processMapLock_);
218 if (processContextMap_.count(processName) == 0) {
219 HILOGE("Scheduler proc:%{public}s invalid", Str16ToStr8(processName).c_str());
220 return false;
221 }
222 processContext = processContextMap_[processName];
223 if (processContext == nullptr) {
224 HILOGE("Scheduler proc:%{public}s context is null", Str16ToStr8(processName).c_str());
225 return false;
226 }
227 return true;
228 }
229
IsSystemAbilityUnloading(int32_t systemAbilityId)230 bool SystemAbilityStateScheduler::IsSystemAbilityUnloading(int32_t systemAbilityId)
231 {
232 std::shared_ptr<SystemAbilityContext> abilityContext;
233 if (!GetSystemAbilityContext(systemAbilityId, abilityContext)) {
234 return false;
235 }
236 std::lock_guard<std::mutex> autoLock(abilityContext->ownProcessContext->processLock);
237 if (abilityContext->state ==SystemAbilityState::UNLOADING
238 || abilityContext->ownProcessContext->state == SystemProcessState::STOPPING) {
239 return true;
240 }
241 return false;
242 }
243
HandleLoadAbilityEvent(int32_t systemAbilityId,bool & isExist)244 int32_t SystemAbilityStateScheduler::HandleLoadAbilityEvent(int32_t systemAbilityId, bool& isExist)
245 {
246 std::shared_ptr<SystemAbilityContext> abilityContext;
247 if (!GetSystemAbilityContext(systemAbilityId, abilityContext)) {
248 isExist = false;
249 return ERR_INVALID_VALUE;
250 }
251 std::lock_guard<std::mutex> autoLock(abilityContext->ownProcessContext->processLock);
252 if (abilityContext->ownProcessContext->state == SystemProcessState::NOT_STARTED) {
253 isExist = false;
254 return ERR_INVALID_VALUE;
255 }
256 if (abilityContext->ownProcessContext->state == SystemProcessState::STARTED
257 && abilityContext->state ==SystemAbilityState::NOT_LOADED) {
258 HILOGD("Scheduler SA:%{public}d handle load event by check start", systemAbilityId);
259 bool result = SystemAbilityManager::GetInstance()->DoLoadOnDemandAbility(systemAbilityId, isExist);
260 if (result) {
261 return stateMachine_->AbilityStateTransitionLocked(abilityContext, SystemAbilityState::LOADING);
262 }
263 return ERR_INVALID_VALUE;
264 }
265 isExist = true;
266 return ERR_OK;
267 }
268
HandleLoadAbilityEvent(const LoadRequestInfo & loadRequestInfo)269 int32_t SystemAbilityStateScheduler::HandleLoadAbilityEvent(const LoadRequestInfo& loadRequestInfo)
270 {
271 std::shared_ptr<SystemAbilityContext> abilityContext;
272 if (!GetSystemAbilityContext(loadRequestInfo.systemAbilityId, abilityContext)) {
273 return GET_SA_CONTEXT_FAIL;
274 }
275 HILOGI("Scheduler SA:%{public}d load start %{public}d,%{public}d_"
276 "%{public}d_%{public}d", loadRequestInfo.systemAbilityId, loadRequestInfo.callingPid,
277 loadRequestInfo.loadEvent.eventId, abilityContext->ownProcessContext->state, abilityContext->state);
278 std::lock_guard<std::mutex> autoLock(abilityContext->ownProcessContext->processLock);
279 int32_t result = HandleLoadAbilityEventLocked(abilityContext, loadRequestInfo);
280 if (result != ERR_OK) {
281 HILOGE("Scheduler SA:%{public}d handle load fail,ret:%{public}d",
282 loadRequestInfo.systemAbilityId, result);
283 }
284 return result;
285 }
286
HandleLoadAbilityEventLocked(const std::shared_ptr<SystemAbilityContext> & abilityContext,const LoadRequestInfo & loadRequestInfo)287 int32_t SystemAbilityStateScheduler::HandleLoadAbilityEventLocked(
288 const std::shared_ptr<SystemAbilityContext>& abilityContext, const LoadRequestInfo& loadRequestInfo)
289 {
290 if (abilityContext->state ==SystemAbilityState::UNLOADING
291 || abilityContext->ownProcessContext->state == SystemProcessState::STOPPING) {
292 return PendLoadEventLocked(abilityContext, loadRequestInfo);
293 }
294 nlohmann::json activeReason;
295 activeReason[KEY_EVENT_ID] = loadRequestInfo.loadEvent.eventId;
296 activeReason[KEY_NAME] = loadRequestInfo.loadEvent.name;
297 activeReason[KEY_VALUE] = loadRequestInfo.loadEvent.value;
298 activeReason[KEY_EXTRA_DATA_ID] = loadRequestInfo.loadEvent.extraDataId;
299 int32_t result = INVALID_SA_STATE;
300 switch (abilityContext->state) {
301 case SystemAbilityState::LOADING:
302 result = RemovePendingUnloadEventLocked(abilityContext);
303 break;
304 case SystemAbilityState::LOADED:
305 result = RemoveDelayUnloadEventLocked(abilityContext->systemAbilityId);
306 break;
307 case SystemAbilityState::UNLOADABLE:
308 result = ActiveSystemAbilityLocked(abilityContext, activeReason);
309 break;
310 case SystemAbilityState::NOT_LOADED:
311 result = ERR_OK;
312 break;
313 default:
314 result = INVALID_SA_STATE;
315 HILOGI("Scheduler SA:%{public}d in state %{public}d, can't load SA",
316 loadRequestInfo.systemAbilityId, abilityContext->state);
317 break;
318 }
319 if (result == ERR_OK) {
320 return DoLoadSystemAbilityLocked(abilityContext, loadRequestInfo);
321 }
322 return result;
323 }
324
HandleUnloadAbilityEvent(const std::shared_ptr<UnloadRequestInfo> unloadRequestInfo)325 int32_t SystemAbilityStateScheduler::HandleUnloadAbilityEvent(
326 const std::shared_ptr<UnloadRequestInfo> unloadRequestInfo)
327 {
328 if (unloadRequestInfo == nullptr) {
329 HILOGE("Scheduler:HandleUnloadSaEvent unloadRequestInfo is null");
330 return UNLOAD_REQUEST_NULL;
331 }
332 std::shared_ptr<SystemAbilityContext> abilityContext;
333 if (!GetSystemAbilityContext(unloadRequestInfo->systemAbilityId, abilityContext)) {
334 return GET_SA_CONTEXT_FAIL;
335 }
336 HILOGI("Scheduler SA:%{public}d unload start %{public}d,%{public}d_"
337 "%{public}d_%{public}d", unloadRequestInfo->systemAbilityId, unloadRequestInfo->callingPid,
338 unloadRequestInfo->unloadEvent.eventId, abilityContext->ownProcessContext->state, abilityContext->state);
339 std::lock_guard<std::mutex> autoLock(abilityContext->ownProcessContext->processLock);
340 int32_t result = HandleUnloadAbilityEventLocked(abilityContext, unloadRequestInfo);
341 if (result != ERR_OK) {
342 HILOGE("Scheduler SA:%{public}d handle unload fail,ret:%{public}d",
343 unloadRequestInfo->systemAbilityId, result);
344 }
345 return result;
346 }
347
HandleUnloadAbilityEventLocked(const std::shared_ptr<SystemAbilityContext> & abilityContext,const std::shared_ptr<UnloadRequestInfo> unloadRequestInfo)348 int32_t SystemAbilityStateScheduler::HandleUnloadAbilityEventLocked(
349 const std::shared_ptr<SystemAbilityContext>& abilityContext,
350 const std::shared_ptr<UnloadRequestInfo> unloadRequestInfo)
351 {
352 if (unloadRequestInfo == nullptr) {
353 HILOGE("Scheduler SA:%{public}d unloadRequestInfo is null", abilityContext->systemAbilityId);
354 return UNLOAD_REQUEST_NULL;
355 }
356 abilityContext->unloadRequest = unloadRequestInfo;
357 int32_t result = INVALID_SA_STATE;
358 switch (abilityContext->state) {
359 case SystemAbilityState::LOADING:
360 result = PendUnloadEventLocked(abilityContext, unloadRequestInfo);
361 break;
362 case SystemAbilityState::LOADED:
363 if (unloadRequestInfo->unloadEvent.eventId == INTERFACE_CALL) {
364 result = ProcessDelayUnloadEventLocked(abilityContext->systemAbilityId);
365 } else {
366 result = SendDelayUnloadEventLocked(abilityContext->systemAbilityId, abilityContext->delayUnloadTime);
367 }
368 break;
369 default:
370 result = ERR_OK;
371 HILOGI("Scheduler SA:%{public}d in state %{public}d,not need unload SA,callPid:%{public}d",
372 abilityContext->systemAbilityId, abilityContext->state, unloadRequestInfo->callingPid);
373 break;
374 }
375 return result;
376 }
377
HandleCancelUnloadAbilityEvent(int32_t systemAbilityId)378 int32_t SystemAbilityStateScheduler::HandleCancelUnloadAbilityEvent(int32_t systemAbilityId)
379 {
380 HILOGI("Scheduler SA:%{public}d cancel unload start", systemAbilityId);
381 std::shared_ptr<SystemAbilityContext> abilityContext;
382 if (!GetSystemAbilityContext(systemAbilityId, abilityContext)) {
383 return ERR_INVALID_VALUE;
384 }
385 nlohmann::json activeReason;
386 activeReason[KEY_EVENT_ID] = INTERFACE_CALL;
387 activeReason[KEY_NAME] = CANCEL_UNLOAD;
388 activeReason[KEY_VALUE] = "";
389 activeReason[KEY_EXTRA_DATA_ID] = -1;
390 int32_t result = ERR_INVALID_VALUE;
391 std::lock_guard<std::mutex> autoLock(abilityContext->ownProcessContext->processLock);
392 switch (abilityContext->state) {
393 case SystemAbilityState::UNLOADABLE:
394 result = ActiveSystemAbilityLocked(abilityContext, activeReason);
395 break;
396 default:
397 result = ERR_OK;
398 HILOGI("Scheduler SA:%{public}d in state %{public}d,not need cancel unload",
399 systemAbilityId, abilityContext->state);
400 break;
401 }
402 return result;
403 }
404
ActiveSystemAbilityLocked(const std::shared_ptr<SystemAbilityContext> & abilityContext,const nlohmann::json & activeReason)405 int32_t SystemAbilityStateScheduler::ActiveSystemAbilityLocked(
406 const std::shared_ptr<SystemAbilityContext>& abilityContext,
407 const nlohmann::json& activeReason)
408 {
409 bool result = SystemAbilityManager::GetInstance()->ActiveSystemAbility(abilityContext->systemAbilityId,
410 abilityContext->ownProcessContext->processName, activeReason);
411 if (!result) {
412 HILOGE("Scheduler SA:%{public}d active fail", abilityContext->systemAbilityId);
413 return ACTIVE_SA_FAIL;
414 }
415 return stateMachine_->AbilityStateTransitionLocked(abilityContext, SystemAbilityState::LOADED);
416 }
417
SendAbilityStateEvent(int32_t systemAbilityId,AbilityStateEvent event)418 int32_t SystemAbilityStateScheduler::SendAbilityStateEvent(int32_t systemAbilityId, AbilityStateEvent event)
419 {
420 HILOGD("Scheduler SA:%{public}d recv state event", systemAbilityId);
421 std::shared_ptr<SystemAbilityContext> abilityContext;
422 if (!GetSystemAbilityContext(systemAbilityId, abilityContext)) {
423 return ERR_INVALID_VALUE;
424 }
425 std::lock_guard<std::mutex> autoLock(abilityContext->ownProcessContext->processLock);
426 return stateEventHandler_->HandleAbilityEventLocked(abilityContext, event);
427 }
428
SendProcessStateEvent(const ProcessInfo & processInfo,ProcessStateEvent event)429 int32_t SystemAbilityStateScheduler::SendProcessStateEvent(const ProcessInfo& processInfo, ProcessStateEvent event)
430 {
431 HILOGD("Scheduler proc:%{public}s receive state event",
432 Str16ToStr8(processInfo.processName).c_str());
433 std::shared_ptr<SystemProcessContext> processContext;
434 if (!GetSystemProcessContext(processInfo.processName, processContext)) {
435 return ERR_INVALID_VALUE;
436 }
437 std::lock_guard<std::mutex> autoLock(processContext->processLock);
438 return stateEventHandler_->HandleProcessEventLocked(processContext, processInfo, event);
439 }
440
SendDelayUnloadEventLocked(uint32_t systemAbilityId,int32_t delayTime)441 int32_t SystemAbilityStateScheduler::SendDelayUnloadEventLocked(uint32_t systemAbilityId, int32_t delayTime)
442 {
443 if (unloadEventHandler_ == nullptr) {
444 HILOGE("Scheduler:unload handler not init");
445 return UNLOAD_EVENT_HANDLER_NULL;
446 }
447 if (unloadEventHandler_->HasInnerEvent(systemAbilityId)) {
448 return ERR_OK;
449 }
450 HILOGI("Scheduler SA:%{public}d send delay unload event", systemAbilityId);
451 bool ret = unloadEventHandler_->SendEvent(systemAbilityId, 0, delayTime);
452 if (!ret) {
453 HILOGE("Scheduler:send event fail");
454 return SEND_EVENT_FAIL;
455 }
456 return ERR_OK;
457 }
458
RemoveDelayUnloadEventLocked(uint32_t systemAbilityId)459 int32_t SystemAbilityStateScheduler::RemoveDelayUnloadEventLocked(uint32_t systemAbilityId)
460 {
461 if (unloadEventHandler_ == nullptr) {
462 HILOGE("Scheduler:unload handler not init");
463 return UNLOAD_EVENT_HANDLER_NULL;
464 }
465 if (!unloadEventHandler_->HasInnerEvent(systemAbilityId)) {
466 return ERR_OK;
467 }
468 HILOGI("Scheduler SA:%{public}d rm delay unload event", systemAbilityId);
469 unloadEventHandler_->RemoveEvent(systemAbilityId);
470 return ERR_OK;
471 }
472
PendLoadEventLocked(const std::shared_ptr<SystemAbilityContext> & abilityContext,const LoadRequestInfo & loadRequestInfo)473 int32_t SystemAbilityStateScheduler::PendLoadEventLocked(const std::shared_ptr<SystemAbilityContext>& abilityContext,
474 const LoadRequestInfo& loadRequestInfo)
475 {
476 HILOGI("Scheduler SA:%{public}d save load event", abilityContext->systemAbilityId);
477 if (loadRequestInfo.callback == nullptr) {
478 HILOGW("Scheduler:callback invalid!");
479 return CALLBACK_NULL;
480 }
481 bool isExist = std::any_of(abilityContext->pendingLoadEventList.begin(),
482 abilityContext->pendingLoadEventList.end(), [&loadRequestInfo](const auto& loadEventItem) {
483 return loadRequestInfo.callback->AsObject() == loadEventItem.callback->AsObject();
484 });
485 if (isExist) {
486 HILOGI("Scheduler SA:%{public}d existed callback", abilityContext->systemAbilityId);
487 return ERR_OK;
488 }
489 auto& count = abilityContext->pendingLoadEventCountMap[loadRequestInfo.callingPid];
490 if (count >= MAX_SUBSCRIBE_COUNT) {
491 HILOGE("Scheduler SA:%{public}d pid:%{public}d overflow max callback count!",
492 abilityContext->systemAbilityId, loadRequestInfo.callingPid);
493 return PEND_LOAD_EVENT_SIZE_LIMIT;
494 }
495 ++count;
496 abilityContext->pendingLoadEventList.emplace_back(loadRequestInfo);
497 abilityContext->pendingEvent = PendingEvent::LOAD_ABILITY_EVENT;
498 return ERR_OK;
499 }
500
PendUnloadEventLocked(const std::shared_ptr<SystemAbilityContext> & abilityContext,const std::shared_ptr<UnloadRequestInfo> unloadRequestInfo)501 int32_t SystemAbilityStateScheduler::PendUnloadEventLocked(
502 const std::shared_ptr<SystemAbilityContext>& abilityContext,
503 const std::shared_ptr<UnloadRequestInfo> unloadRequestInfo)
504 {
505 HILOGI("Scheduler SA:%{public}d save unload event", abilityContext->systemAbilityId);
506 abilityContext->pendingEvent = PendingEvent::UNLOAD_ABILITY_EVENT;
507 abilityContext->pendingUnloadEvent = unloadRequestInfo;
508 return ERR_OK;
509 }
510
RemovePendingUnloadEventLocked(const std::shared_ptr<SystemAbilityContext> & abilityContext)511 int32_t SystemAbilityStateScheduler::RemovePendingUnloadEventLocked(
512 const std::shared_ptr<SystemAbilityContext>& abilityContext)
513 {
514 if (abilityContext->pendingEvent == PendingEvent::UNLOAD_ABILITY_EVENT) {
515 HILOGI("Scheduler SA:%{public}d rm pending unload event", abilityContext->systemAbilityId);
516 abilityContext->pendingEvent = PendingEvent::NO_EVENT;
517 }
518 return ERR_OK;
519 }
520
HandlePendingLoadEventLocked(const std::shared_ptr<SystemAbilityContext> & abilityContext)521 int32_t SystemAbilityStateScheduler::HandlePendingLoadEventLocked(
522 const std::shared_ptr<SystemAbilityContext>& abilityContext)
523 {
524 if (abilityContext->pendingEvent != PendingEvent::LOAD_ABILITY_EVENT) {
525 HILOGD("Scheduler SA:%{public}d no pending load event", abilityContext->systemAbilityId);
526 return ERR_OK;
527 }
528 HILOGI("Scheduler SA:%{public}d handle pending load event start", abilityContext->systemAbilityId);
529 abilityContext->pendingEvent = PendingEvent::NO_EVENT;
530 for (auto& loadRequestInfo : abilityContext->pendingLoadEventList) {
531 int32_t result = HandleLoadAbilityEventLocked(abilityContext, loadRequestInfo);
532 if (result != ERR_OK) {
533 HILOGE("Scheduler SA:%{public}d handle pending load event fail,callPid:%{public}d",
534 abilityContext->systemAbilityId, loadRequestInfo.callingPid);
535 }
536 }
537 abilityContext->pendingLoadEventList.clear();
538 abilityContext->pendingLoadEventCountMap.clear();
539 return ERR_OK;
540 }
541
HandlePendingUnloadEventLocked(const std::shared_ptr<SystemAbilityContext> & abilityContext)542 int32_t SystemAbilityStateScheduler::HandlePendingUnloadEventLocked(
543 const std::shared_ptr<SystemAbilityContext>& abilityContext)
544 {
545 if (abilityContext->pendingEvent != PendingEvent::UNLOAD_ABILITY_EVENT) {
546 HILOGD("Scheduler SA:%{public}d no pending unload event", abilityContext->systemAbilityId);
547 return ERR_OK;
548 }
549 HILOGI("Scheduler SA:%{public}d handle pending unload event start", abilityContext->systemAbilityId);
550 abilityContext->pendingEvent = PendingEvent::NO_EVENT;
551 return HandleUnloadAbilityEventLocked(abilityContext, abilityContext->pendingUnloadEvent);
552 }
553
DoLoadSystemAbilityLocked(const std::shared_ptr<SystemAbilityContext> & abilityContext,const LoadRequestInfo & loadRequestInfo)554 int32_t SystemAbilityStateScheduler::DoLoadSystemAbilityLocked(
555 const std::shared_ptr<SystemAbilityContext>& abilityContext, const LoadRequestInfo& loadRequestInfo)
556 {
557 int32_t result = ERR_OK;
558 if (loadRequestInfo.deviceId == LOCAL_DEVICE) {
559 HILOGD("Scheduler SA:%{public}d load ability from local start", abilityContext->systemAbilityId);
560 result = SystemAbilityManager::GetInstance()->DoLoadSystemAbility(abilityContext->systemAbilityId,
561 abilityContext->ownProcessContext->processName, loadRequestInfo.callback, loadRequestInfo.callingPid,
562 loadRequestInfo.loadEvent);
563 } else {
564 HILOGD("Scheduler SA:%{public}d load ability from remote start", abilityContext->systemAbilityId);
565 result = SystemAbilityManager::GetInstance()->DoLoadSystemAbilityFromRpc(loadRequestInfo.deviceId,
566 abilityContext->systemAbilityId, abilityContext->ownProcessContext->processName, loadRequestInfo.callback,
567 loadRequestInfo.loadEvent);
568 }
569 if (result == ERR_OK && abilityContext->state == SystemAbilityState::NOT_LOADED) {
570 return stateMachine_->AbilityStateTransitionLocked(abilityContext, SystemAbilityState::LOADING);
571 }
572 return result;
573 }
574
TryUnloadAllSystemAbility(const std::shared_ptr<SystemProcessContext> & processContext)575 int32_t SystemAbilityStateScheduler::TryUnloadAllSystemAbility(
576 const std::shared_ptr<SystemProcessContext>& processContext)
577 {
578 if (processContext == nullptr) {
579 HILOGE("Scheduler:proc context is null");
580 return ERR_INVALID_VALUE;
581 }
582 std::lock_guard<std::mutex> autoLock(processContext->processLock);
583 if (CanUnloadAllSystemAbilityLocked(processContext, true)) {
584 return UnloadAllSystemAbilityLocked(processContext);
585 }
586 return ERR_OK;
587 }
588
CanUnloadAllSystemAbility(const std::shared_ptr<SystemProcessContext> & processContext)589 bool SystemAbilityStateScheduler::CanUnloadAllSystemAbility(
590 const std::shared_ptr<SystemProcessContext>& processContext)
591 {
592 std::lock_guard<std::mutex> autoLock(processContext->stateCountLock);
593 return CanUnloadAllSystemAbilityLocked(processContext, true);
594 }
595
CanUnloadAllSystemAbilityLocked(const std::shared_ptr<SystemProcessContext> & processContext,bool isNeedCheckRecycleStrategy)596 bool SystemAbilityStateScheduler::CanUnloadAllSystemAbilityLocked(
597 const std::shared_ptr<SystemProcessContext>& processContext, bool isNeedCheckRecycleStrategy)
598 {
599 uint32_t notLoadAbilityCount = processContext->abilityStateCountMap[SystemAbilityState::NOT_LOADED];
600 uint32_t unloadableAbilityCount = processContext->abilityStateCountMap[SystemAbilityState::UNLOADABLE];
601 if (unloadableAbilityCount == 0) {
602 return false;
603 }
604 if (notLoadAbilityCount + unloadableAbilityCount == processContext->saList.size()) {
605 if (isNeedCheckRecycleStrategy) {
606 return CheckSaIsImmediatelyRecycle(processContext);
607 } else {
608 return true;
609 }
610 }
611 HILOGI("Scheduler proc:%{public}s SA num:%{public}zu,notloaded:%{public}d,unloadable:%{public}d",
612 Str16ToStr8(processContext->processName).c_str(), processContext->saList.size(), notLoadAbilityCount,
613 unloadableAbilityCount);
614 return false;
615 }
616
CheckSaIsImmediatelyRecycle(const std::shared_ptr<SystemProcessContext> & processContext)617 bool SystemAbilityStateScheduler::CheckSaIsImmediatelyRecycle(
618 const std::shared_ptr<SystemProcessContext>& processContext)
619 {
620 for (auto& saId: processContext->saList) {
621 if (SystemAbilityManager::GetInstance()->CheckSaIsImmediatelyRecycle(saId)) {
622 return true;
623 }
624 }
625 HILOGI("CheckSaIsImmediatelyRecycle is false");
626 return false;
627 }
628
PostTryUnloadAllAbilityTask(const std::shared_ptr<SystemProcessContext> & processContext)629 int32_t SystemAbilityStateScheduler::PostTryUnloadAllAbilityTask(
630 const std::shared_ptr<SystemProcessContext>& processContext)
631 {
632 bool result = processHandler_->PostTask([this, processContext] () {
633 int32_t ret = TryUnloadAllSystemAbility(processContext);
634 if (ret != ERR_OK) {
635 HILOGE("Scheduler proc:%{public}s unload all SA fail",
636 Str16ToStr8(processContext->processName).c_str());
637 }
638 });
639 if (!result) {
640 HILOGW("Scheduler proc:%{public}s post task fail",
641 Str16ToStr8(processContext->processName).c_str());
642 return ERR_INVALID_VALUE;
643 }
644 return ERR_OK;
645 }
646
PostUnloadTimeoutTask(const std::shared_ptr<SystemProcessContext> & processContext)647 int32_t SystemAbilityStateScheduler::PostUnloadTimeoutTask(const std::shared_ptr<SystemProcessContext>& processContext)
648 {
649 auto timeoutTask = [this, processContext] () {
650 std::string name = KEY_UNLOAD_TIMEOUT + Str16ToStr8(processContext->processName);
651 if (processHandler_ != nullptr) {
652 HILOGD("TimeoutTask deltask proc:%{public}s", name.c_str());
653 processHandler_->DelTask(name);
654 } else {
655 HILOGE("TimeoutTask processHandler_ is null");
656 }
657 std::lock_guard<std::mutex> autoLock(processContext->processLock);
658 if (processContext->state == SystemProcessState::STOPPING) {
659 HILOGW("Scheduler proc:%{public}s unload SA timeout",
660 Str16ToStr8(processContext->processName).c_str());
661 int32_t result = KillSystemProcessLocked(processContext);
662 HILOGI("Scheduler proc:%{public}s kill proc timeout ret:%{public}d",
663 Str16ToStr8(processContext->processName).c_str(), result);
664 }
665 };
666 bool ret = processHandler_->PostTask(timeoutTask, KEY_UNLOAD_TIMEOUT + Str16ToStr8(processContext->processName),
667 UNLOAD_TIMEOUT_TIME);
668 if (!ret) {
669 HILOGW("Scheduler proc:%{public}s post timeout task fail",
670 Str16ToStr8(processContext->processName).c_str());
671 return ERR_INVALID_VALUE;
672 }
673 return ERR_OK;
674 }
675
RemoveUnloadTimeoutTask(const std::shared_ptr<SystemProcessContext> & processContext)676 void SystemAbilityStateScheduler::RemoveUnloadTimeoutTask(const std::shared_ptr<SystemProcessContext>& processContext)
677 {
678 processHandler_->RemoveTask(KEY_UNLOAD_TIMEOUT + Str16ToStr8(processContext->processName));
679 }
680
PostTryKillProcessTask(const std::shared_ptr<SystemProcessContext> & processContext)681 int32_t SystemAbilityStateScheduler::PostTryKillProcessTask(
682 const std::shared_ptr<SystemProcessContext>& processContext)
683 {
684 bool result = processHandler_->PostTask([this, processContext] () {
685 int32_t ret = TryKillSystemProcess(processContext);
686 if (ret != ERR_OK) {
687 HILOGE("Scheduler proc:%{public}s kill proc fail",
688 Str16ToStr8(processContext->processName).c_str());
689 }
690 });
691 if (!result) {
692 HILOGW("Scheduler proc:%{public}s post task fail",
693 Str16ToStr8(processContext->processName).c_str());
694 return ERR_INVALID_VALUE;
695 }
696 return ERR_OK;
697 }
698
UnloadAllSystemAbilityLocked(const std::shared_ptr<SystemProcessContext> & processContext)699 int32_t SystemAbilityStateScheduler::UnloadAllSystemAbilityLocked(
700 const std::shared_ptr<SystemProcessContext>& processContext)
701 {
702 HILOGI("Scheduler proc:%{public}s unload all SA", Str16ToStr8(processContext->processName).c_str());
703 for (auto& saId : processContext->saList) {
704 std::shared_ptr<SystemAbilityContext> abilityContext;
705 if (!GetSystemAbilityContext(saId, abilityContext)) {
706 continue;
707 }
708 int32_t result = ERR_OK;
709 if (abilityContext->state == SystemAbilityState::UNLOADABLE) {
710 result = DoUnloadSystemAbilityLocked(abilityContext);
711 }
712 if (result != ERR_OK) {
713 HILOGE("Scheduler SA:%{public}d unload fail", saId);
714 }
715 }
716 PostUnloadTimeoutTask(processContext);
717 return stateMachine_->ProcessStateTransitionLocked(processContext, SystemProcessState::STOPPING);
718 }
719
DoUnloadSystemAbilityLocked(const std::shared_ptr<SystemAbilityContext> & abilityContext)720 int32_t SystemAbilityStateScheduler::DoUnloadSystemAbilityLocked(
721 const std::shared_ptr<SystemAbilityContext>& abilityContext)
722 {
723 if (abilityContext->unloadRequest == nullptr) {
724 HILOGE("Scheduler SA:%{public}d DoUnloadSaLocked unloadRequest is null",
725 abilityContext->systemAbilityId);
726 return ERR_INVALID_VALUE;
727 }
728 int32_t result = ERR_OK;
729 HILOGI("Scheduler SA:%{public}d unload start", abilityContext->systemAbilityId);
730 result = SystemAbilityManager::GetInstance()->DoUnloadSystemAbility(abilityContext->systemAbilityId,
731 abilityContext->ownProcessContext->processName, abilityContext->unloadRequest->unloadEvent);
732 if (result == ERR_OK) {
733 return stateMachine_->AbilityStateTransitionLocked(abilityContext, SystemAbilityState::UNLOADING);
734 }
735 return result;
736 }
737
UnloadAllIdleSystemAbility()738 int32_t SystemAbilityStateScheduler::UnloadAllIdleSystemAbility()
739 {
740 HILOGI("Scheduler:UnloadAllIdleSa");
741 int32_t result = ERR_OK;
742 std::shared_lock<std::shared_mutex> readLock(processMapLock_);
743 for (auto it : processContextMap_) {
744 auto& processContext = it.second;
745 if (processContext == nullptr) {
746 continue;
747 }
748
749 int32_t ret = ERR_OK;
750 std::lock_guard<std::mutex> autoLock(processContext->processLock);
751 if (CanUnloadAllSystemAbilityLocked(processContext)) {
752 ret = UnloadAllSystemAbilityLocked(processContext);
753 }
754 if (ret != ERR_OK) {
755 result = ret;
756 HILOGI("Scheduler proc:%{public}s unload all SA fail",
757 Str16ToStr8(processContext->processName).c_str());
758 }
759 }
760 return result;
761 }
762
TryKillSystemProcess(const std::shared_ptr<SystemProcessContext> & processContext)763 int32_t SystemAbilityStateScheduler::TryKillSystemProcess(
764 const std::shared_ptr<SystemProcessContext>& processContext)
765 {
766 if (processContext == nullptr) {
767 HILOGE("Scheduler:proc context is null");
768 return ERR_INVALID_VALUE;
769 }
770 std::lock_guard<std::mutex> autoLock(processContext->processLock);
771 if (CanKillSystemProcessLocked(processContext)) {
772 return KillSystemProcessLocked(processContext);
773 }
774 return ERR_OK;
775 }
776
CanKillSystemProcess(const std::shared_ptr<SystemProcessContext> & processContext)777 bool SystemAbilityStateScheduler::CanKillSystemProcess(
778 const std::shared_ptr<SystemProcessContext>& processContext)
779 {
780 std::lock_guard<std::mutex> autoLock(processContext->stateCountLock);
781 return CanKillSystemProcessLocked(processContext);
782 }
783
CanKillSystemProcessLocked(const std::shared_ptr<SystemProcessContext> & processContext)784 bool SystemAbilityStateScheduler::CanKillSystemProcessLocked(
785 const std::shared_ptr<SystemProcessContext>& processContext)
786 {
787 uint32_t notLoadAbilityCount = processContext->abilityStateCountMap[SystemAbilityState::NOT_LOADED];
788 HILOGI("Scheduler proc:%{public}s,SA num:%{public}zu,notloaded num:%{public}d",
789 Str16ToStr8(processContext->processName).c_str(), processContext->saList.size(), notLoadAbilityCount);
790 if (notLoadAbilityCount == processContext->saList.size()) {
791 return true;
792 }
793 return false;
794 }
795
KillSystemProcessLocked(const std::shared_ptr<SystemProcessContext> & processContext)796 int32_t SystemAbilityStateScheduler::KillSystemProcessLocked(
797 const std::shared_ptr<SystemProcessContext>& processContext)
798 {
799 int64_t begin = GetTickCount();
800 int32_t result = ERR_OK;
801 {
802 SamgrXCollie samgrXCollie("samgr--killProccess_" + Str16ToStr8(processContext->processName));
803 result = ServiceControlWithExtra(Str16ToStr8(processContext->processName).c_str(),
804 ServiceAction::STOP, nullptr, 0);
805 }
806
807 int64_t duration = GetTickCount() - begin;
808 if (result != 0) {
809 ReportProcessStopFail(Str16ToStr8(processContext->processName), processContext->pid, processContext->uid,
810 "err:" + ToString(result));
811 } else {
812 ReportProcessStopDuration(Str16ToStr8(processContext->processName), processContext->pid,
813 processContext->uid, duration);
814 }
815 KHILOGI("Scheduler proc:%{public}s kill pid:%{public}d,%{public}d_%{public}d_"
816 "%{public}" PRId64 "ms", Str16ToStr8(processContext->processName).c_str(), processContext->pid,
817 processContext->uid, result, duration);
818 return result;
819 }
820
CanRestartProcessLocked(const std::shared_ptr<SystemProcessContext> & processContext)821 bool SystemAbilityStateScheduler::CanRestartProcessLocked(const std::shared_ptr<SystemProcessContext>& processContext)
822 {
823 if (!processContext->enableRestart) {
824 return false;
825 }
826 int64_t curtime = GetTickCount();
827 if (processContext->restartCountsCtrl.size() < RESTART_TIMES_LIMIT) {
828 processContext->restartCountsCtrl.push_back(curtime);
829 return true;
830 } else if (processContext->restartCountsCtrl.size() == RESTART_TIMES_LIMIT) {
831 if (curtime - processContext->restartCountsCtrl.front() < RESTART_TIME_INTERVAL_LIMIT) {
832 processContext->enableRestart = false;
833 return false;
834 }
835 processContext->restartCountsCtrl.push_back(curtime);
836 processContext->restartCountsCtrl.pop_front();
837 return true;
838 } else {
839 HILOGE("Scheduler proc:%{public}s unkown err",
840 Str16ToStr8(processContext->processName).c_str());
841 }
842 return false;
843 }
844
GetAbnormallyDiedAbilityLocked(std::shared_ptr<SystemProcessContext> & processContext,std::list<std::shared_ptr<SystemAbilityContext>> & abnormallyDiedAbilityList)845 int32_t SystemAbilityStateScheduler::GetAbnormallyDiedAbilityLocked(
846 std::shared_ptr<SystemProcessContext>& processContext,
847 std::list<std::shared_ptr<SystemAbilityContext>>& abnormallyDiedAbilityList)
848 {
849 for (auto& saId : processContext->saList) {
850 std::shared_ptr<SystemAbilityContext> abilityContext;
851 if (!GetSystemAbilityContext(saId, abilityContext)) {
852 continue;
853 }
854 if (abilityContext->state == SystemAbilityState::LOADED
855 || abilityContext->state == SystemAbilityState::LOADING) {
856 SamgrUtil::SendUpdateSaState(abilityContext->systemAbilityId, "crash");
857 HILOGI("Scheduler SA:%{public}d abnormally died", abilityContext->systemAbilityId);
858 if (abilityContext->systemAbilityId == SUBSYS_ACCOUNT_SYS_ABILITY_ID_BEGIN) {
859 SystemAbilityManager::GetInstance()->RemoveWhiteCommonEvent();
860 }
861 if (!abilityContext->isAutoRestart) {
862 continue;
863 }
864 if (system::GetBoolParameter("resourceschedule.memmgr.min.memmory.watermark", false)) {
865 HILOGW("restart fail,watermark=true");
866 continue;
867 }
868 HILOGI("Scheduler SA:%{public}d is auto restart", abilityContext->systemAbilityId);
869 abnormallyDiedAbilityList.emplace_back(abilityContext);
870 }
871 }
872 return ERR_OK;
873 }
874
875
HandleAbnormallyDiedAbilityLocked(std::shared_ptr<SystemProcessContext> & processContext,std::list<std::shared_ptr<SystemAbilityContext>> & abnormallyDiedAbilityList)876 int32_t SystemAbilityStateScheduler::HandleAbnormallyDiedAbilityLocked(
877 std::shared_ptr<SystemProcessContext>& processContext,
878 std::list<std::shared_ptr<SystemAbilityContext>>& abnormallyDiedAbilityList)
879 {
880 if (abnormallyDiedAbilityList.empty()) {
881 return ERR_OK;
882 }
883 if (!CanRestartProcessLocked(processContext)) {
884 HILOGW("Scheduler proc:%{public}s can't restart:More than 4 restarts in 20s",
885 Str16ToStr8(processContext->processName).c_str());
886 return ERR_OK;
887 }
888 OnDemandEvent onDemandEvent = {INTERFACE_CALL, "restart"};
889 sptr<ISystemAbilityLoadCallback> callback(new SystemAbilityLoadCallbackStub());
890 for (auto& abilityContext : abnormallyDiedAbilityList) {
891 // Actively remove SA to prevent restart failure if the death recipient of SA is not processed in time.
892 SystemAbilityManager::GetInstance()->RemoveDiedSystemAbility(abilityContext->systemAbilityId);
893 LoadRequestInfo loadRequestInfo = {LOCAL_DEVICE, callback,
894 abilityContext->systemAbilityId, -1, onDemandEvent};
895 HandleLoadAbilityEventLocked(abilityContext, loadRequestInfo);
896 }
897 return ERR_OK;
898 }
899
NotifyProcessStarted(const std::shared_ptr<SystemProcessContext> & processContext)900 void SystemAbilityStateScheduler::NotifyProcessStarted(const std::shared_ptr<SystemProcessContext>& processContext)
901 {
902 std::shared_lock<std::shared_mutex> readLock(listenerSetLock_);
903 for (auto& listener : processListeners_) {
904 if (listener->AsObject() != nullptr) {
905 SystemProcessInfo systemProcessInfo = {Str16ToStr8(processContext->processName), processContext->pid,
906 processContext->uid};
907 listener->OnSystemProcessStarted(systemProcessInfo);
908 }
909 }
910 }
911
NotifyProcessStopped(const std::shared_ptr<SystemProcessContext> & processContext)912 void SystemAbilityStateScheduler::NotifyProcessStopped(const std::shared_ptr<SystemProcessContext>& processContext)
913 {
914 std::shared_lock<std::shared_mutex> readLock(listenerSetLock_);
915 for (auto& listener : processListeners_) {
916 if (listener->AsObject() != nullptr) {
917 SystemProcessInfo systemProcessInfo = {Str16ToStr8(processContext->processName), processContext->pid,
918 processContext->uid};
919 listener->OnSystemProcessStopped(systemProcessInfo);
920 }
921 }
922 }
923
OnProcessStartedLocked(const std::u16string & processName)924 void SystemAbilityStateScheduler::OnProcessStartedLocked(const std::u16string& processName)
925 {
926 HILOGI("Scheduler proc:%{public}s started", Str16ToStr8(processName).c_str());
927 std::shared_ptr<SystemProcessContext> processContext;
928 if (!GetSystemProcessContext(processName, processContext)) {
929 return;
930 }
931 NotifyProcessStarted(processContext);
932 }
933
OnProcessNotStartedLocked(const std::u16string & processName)934 void SystemAbilityStateScheduler::OnProcessNotStartedLocked(const std::u16string& processName)
935 {
936 HILOGI("Scheduler proc:%{public}s stopped", Str16ToStr8(processName).c_str());
937 std::shared_ptr<SystemProcessContext> processContext;
938 if (!GetSystemProcessContext(processName, processContext)) {
939 return;
940 }
941 NotifyProcessStopped(processContext);
942 RemoveUnloadTimeoutTask(processContext);
943
944 std::list<std::shared_ptr<SystemAbilityContext>> abnormallyDiedAbilityList;
945 GetAbnormallyDiedAbilityLocked(processContext, abnormallyDiedAbilityList);
946 for (auto& saId : processContext->saList) {
947 std::shared_ptr<SystemAbilityContext> abilityContext;
948 if (!GetSystemAbilityContext(saId, abilityContext)) {
949 continue;
950 }
951 int32_t result = stateMachine_->AbilityStateTransitionLocked(abilityContext, SystemAbilityState::NOT_LOADED);
952 if (result != ERR_OK) {
953 continue;
954 }
955 HandlePendingLoadEventLocked(abilityContext);
956 }
957 HandleAbnormallyDiedAbilityLocked(processContext, abnormallyDiedAbilityList);
958 }
959
HandleAbilityDiedEvent(int32_t systemAbilityId)960 int32_t SystemAbilityStateScheduler::HandleAbilityDiedEvent(int32_t systemAbilityId)
961 {
962 HILOGD("Scheduler SA:%{public}d handle ability died event", systemAbilityId);
963 return ERR_OK;
964 }
965
OnAbilityNotLoadedLocked(int32_t systemAbilityId)966 void SystemAbilityStateScheduler::OnAbilityNotLoadedLocked(int32_t systemAbilityId)
967 {
968 HILOGI("Scheduler SA:%{public}d not loaded", systemAbilityId);
969 std::shared_ptr<SystemAbilityContext> abilityContext;
970 if (!GetSystemAbilityContext(systemAbilityId, abilityContext)) {
971 return;
972 }
973 RemoveDelayUnloadEventLocked(abilityContext->systemAbilityId);
974 RemovePendingUnloadEventLocked(abilityContext);
975 if (abilityContext->ownProcessContext->state == SystemProcessState::STOPPING) {
976 PostTryKillProcessTask(abilityContext->ownProcessContext);
977 } else if (abilityContext->ownProcessContext->state == SystemProcessState::STARTED) {
978 PostTryUnloadAllAbilityTask(abilityContext->ownProcessContext);
979 }
980 }
981
OnAbilityLoadedLocked(int32_t systemAbilityId)982 void SystemAbilityStateScheduler::OnAbilityLoadedLocked(int32_t systemAbilityId)
983 {
984 HILOGI("Scheduler SA:%{public}d loaded", systemAbilityId);
985 std::shared_ptr<SystemAbilityContext> abilityContext;
986 if (!GetSystemAbilityContext(systemAbilityId, abilityContext)) {
987 return;
988 }
989 HandlePendingUnloadEventLocked(abilityContext);
990 }
991
OnAbilityUnloadableLocked(int32_t systemAbilityId)992 void SystemAbilityStateScheduler::OnAbilityUnloadableLocked(int32_t systemAbilityId)
993 {
994 HILOGI("Scheduler SA:%{public}d unloadable", systemAbilityId);
995 std::shared_ptr<SystemAbilityContext> abilityContext;
996 if (!GetSystemAbilityContext(systemAbilityId, abilityContext)) {
997 return;
998 }
999 PostTryUnloadAllAbilityTask(abilityContext->ownProcessContext);
1000 }
1001
GetSystemProcessInfo(int32_t systemAbilityId,SystemProcessInfo & systemProcessInfo)1002 int32_t SystemAbilityStateScheduler::GetSystemProcessInfo(int32_t systemAbilityId,
1003 SystemProcessInfo& systemProcessInfo)
1004 {
1005 HILOGI("Scheduler:get proc info by [SA:%{public}d]", systemAbilityId);
1006 std::shared_ptr<SystemAbilityContext> abilityContext;
1007 if (!GetSystemAbilityContext(systemAbilityId, abilityContext)) {
1008 HILOGI("Scheduler:get SA context by said fail");
1009 return ERR_INVALID_VALUE;
1010 }
1011 std::shared_ptr<SystemProcessContext> processContext = abilityContext->ownProcessContext;
1012 std::lock_guard<std::mutex> autoLock(processContext->processLock);
1013 systemProcessInfo = {Str16ToStr8(processContext->processName), processContext->pid,
1014 processContext->uid};
1015 return ERR_OK;
1016 }
1017
GetRunningSystemProcess(std::list<SystemProcessInfo> & systemProcessInfos)1018 int32_t SystemAbilityStateScheduler::GetRunningSystemProcess(std::list<SystemProcessInfo>& systemProcessInfos)
1019 {
1020 HILOGI("Scheduler:get running process");
1021 std::shared_lock<std::shared_mutex> readLock(processMapLock_);
1022 for (auto it : processContextMap_) {
1023 auto& processContext = it.second;
1024 if (processContext == nullptr) {
1025 continue;
1026 }
1027 std::lock_guard<std::mutex> autoLock(processContext->processLock);
1028 if (processContext->state == SystemProcessState::STARTED) {
1029 SystemProcessInfo systemProcessInfo = {Str16ToStr8(processContext->processName), processContext->pid,
1030 processContext->uid};
1031 systemProcessInfos.emplace_back(systemProcessInfo);
1032 }
1033 }
1034 return ERR_OK;
1035 }
1036
GetProcessNameByProcessId(int32_t pid,std::u16string & processName)1037 int32_t SystemAbilityStateScheduler::GetProcessNameByProcessId(int32_t pid, std::u16string& processName)
1038 {
1039 HILOGD("[SA Scheduler] get processName by processId");
1040 std::shared_lock<std::shared_mutex> readLock(processMapLock_);
1041 for (auto it : processContextMap_) {
1042 auto& processContext = it.second;
1043 if (processContext == nullptr) {
1044 continue;
1045 }
1046 std::lock_guard<std::mutex> autoLock(processContext->processLock);
1047 if (processContext->pid == pid) {
1048 processName = processContext->processName;
1049 return ERR_OK;
1050 }
1051 }
1052 return ERR_INVALID_VALUE;
1053 }
1054
GetAllSystemAbilityInfo(std::string & result)1055 void SystemAbilityStateScheduler::GetAllSystemAbilityInfo(std::string& result)
1056 {
1057 std::shared_lock<std::shared_mutex> readLock(abiltyMapLock_);
1058 for (auto it : abilityContextMap_) {
1059 if (it.second == nullptr) {
1060 continue;
1061 }
1062 result += "said: ";
1063 result += std::to_string(it.second->systemAbilityId);
1064 result += "\n";
1065 result += "sa_state: ";
1066 result += SA_STATE_ENUM_STR[static_cast<int32_t>(it.second->state)];
1067 result += "\n";
1068 result += "sa_pending_event: ";
1069 result += PENDINGEVENT_ENUM_STR[static_cast<int32_t>(it.second->pendingEvent)];
1070 if (it.second->ownProcessContext != nullptr) {
1071 std::lock_guard<std::mutex> autoLock(it.second->ownProcessContext->stateCountLock);
1072 result += '\n';
1073 result += "process_name: ";
1074 result += Str16ToStr8(it.second->ownProcessContext->processName);
1075 result += '\n';
1076 result += "pid: ";
1077 result += std::to_string(it.second->ownProcessContext->pid);
1078 result += '\n';
1079 result += "uid: ";
1080 result += std::to_string(it.second->ownProcessContext->uid);
1081 }
1082 result += "\n---------------------------------------------------\n";
1083 }
1084 }
1085
GetSystemAbilityInfo(int32_t said,std::string & result)1086 void SystemAbilityStateScheduler::GetSystemAbilityInfo(int32_t said, std::string& result)
1087 {
1088 std::shared_ptr<SystemAbilityContext> abilityContext;
1089 if (!GetSystemAbilityContext(said, abilityContext)) {
1090 result.append("said is not exist");
1091 return;
1092 }
1093 std::lock_guard<std::mutex> autoLock(abilityContext->ownProcessContext->processLock);
1094 result += "said: ";
1095 result += std::to_string(said);
1096 result += "\n";
1097 result += "sa_state: ";
1098 result += SA_STATE_ENUM_STR[static_cast<int32_t>(abilityContext->state)];
1099 result += "\n";
1100 result += "sa_pending_event: ";
1101 result += PENDINGEVENT_ENUM_STR[static_cast<int32_t>(abilityContext->pendingEvent)];
1102 result += "\n";
1103 result += "process_name: ";
1104 result += Str16ToStr8(abilityContext->ownProcessContext->processName);
1105 result += "\n";
1106 result += "process_state: ";
1107 result += PROCESS_STATE_ENUM_STR[static_cast<int32_t>(abilityContext->ownProcessContext->state)];
1108 result += "\n";
1109 result += "pid: ";
1110 result += std::to_string(abilityContext->ownProcessContext->pid);
1111 result += "\n";
1112 }
1113
GetProcessInfo(const std::string & processName,std::string & result)1114 void SystemAbilityStateScheduler::GetProcessInfo(const std::string& processName, std::string& result)
1115 {
1116 std::shared_ptr<SystemProcessContext> processContext;
1117 if (!GetSystemProcessContext(Str8ToStr16(processName), processContext)) {
1118 result.append("process is not exist");
1119 return;
1120 }
1121 std::lock_guard<std::mutex> autoLock(processContext->processLock);
1122 result += "process_name: ";
1123 result += Str16ToStr8(processContext->processName);
1124 result += "\n";
1125 result += "process_state: ";
1126 result += PROCESS_STATE_ENUM_STR[static_cast<int32_t>(processContext->state)];
1127 result += "\n";
1128 result += "pid: ";
1129 result += std::to_string(processContext->pid);
1130 result += "\n---------------------------------------------------\n";
1131 for (auto it : processContext->saList) {
1132 std::shared_ptr<SystemAbilityContext> abilityContext;
1133 if (!GetSystemAbilityContext(it, abilityContext)) {
1134 result.append("process said is not exist");
1135 return;
1136 }
1137 result += "said: ";
1138 result += std::to_string(abilityContext->systemAbilityId);
1139 result += '\n';
1140 result += "sa_state: ";
1141 result += SA_STATE_ENUM_STR[static_cast<int32_t>(abilityContext->state)];
1142 result += '\n';
1143 result += "sa_pending_event: ";
1144 result += PENDINGEVENT_ENUM_STR[static_cast<int32_t>(abilityContext->pendingEvent)];
1145 result += "\n---------------------------------------------------\n";
1146 }
1147 }
1148
GetAllSystemAbilityInfoByState(const std::string & state,std::string & result)1149 void SystemAbilityStateScheduler::GetAllSystemAbilityInfoByState(const std::string& state, std::string& result)
1150 {
1151 std::shared_lock<std::shared_mutex> readLock(abiltyMapLock_);
1152 for (auto it : abilityContextMap_) {
1153 if (it.second == nullptr || SA_STATE_ENUM_STR[static_cast<int32_t>(it.second->state)] != state) {
1154 continue;
1155 }
1156 result += "said: ";
1157 result += std::to_string(it.second->systemAbilityId);
1158 result += '\n';
1159 result += "sa_state: ";
1160 result += SA_STATE_ENUM_STR[static_cast<int32_t>(it.second->state)];
1161 result += '\n';
1162 result += "sa_pending_event: ";
1163 result += PENDINGEVENT_ENUM_STR[static_cast<int32_t>(it.second->pendingEvent)];
1164 if (it.second->ownProcessContext != nullptr) {
1165 std::lock_guard<std::mutex> autoLock(it.second->ownProcessContext->stateCountLock);
1166 result += '\n';
1167 result += "process_name: ";
1168 result += Str16ToStr8(it.second->ownProcessContext->processName);
1169 result += '\n';
1170 result += "pid: ";
1171 result += std::to_string(it.second->ownProcessContext->pid);
1172 result += '\n';
1173 result += "uid: ";
1174 result += std::to_string(it.second->ownProcessContext->uid);
1175 }
1176 result += "\n---------------------------------------------------\n";
1177 }
1178 }
1179
SubscribeSystemProcess(const sptr<ISystemProcessStatusChange> & listener)1180 int32_t SystemAbilityStateScheduler::SubscribeSystemProcess(const sptr<ISystemProcessStatusChange>& listener)
1181 {
1182 std::unique_lock<std::shared_mutex> writeLock(listenerSetLock_);
1183 auto iter = std::find_if(processListeners_.begin(), processListeners_.end(),
1184 [listener](sptr<ISystemProcessStatusChange>& item) {
1185 return item->AsObject() == listener->AsObject();
1186 });
1187 if (iter == processListeners_.end()) {
1188 if (processListenerDeath_ != nullptr) {
1189 bool ret = listener->AsObject()->AddDeathRecipient(processListenerDeath_);
1190 HILOGI("SubscribeSystemProcess AddDeathRecipient %{public}s", ret ? "succeed" : "failed");
1191 }
1192 processListeners_.emplace_back(listener);
1193 } else {
1194 HILOGI("SubscribeSystemProcess listener already exists");
1195 }
1196 return ERR_OK;
1197 }
1198
UnSubscribeSystemProcess(const sptr<ISystemProcessStatusChange> & listener)1199 int32_t SystemAbilityStateScheduler::UnSubscribeSystemProcess(const sptr<ISystemProcessStatusChange>& listener)
1200 {
1201 std::unique_lock<std::shared_mutex> writeLock(listenerSetLock_);
1202 auto iter = std::find_if(processListeners_.begin(), processListeners_.end(),
1203 [listener](sptr<ISystemProcessStatusChange>& item) {
1204 return item->AsObject() == listener->AsObject();
1205 });
1206 if (iter != processListeners_.end()) {
1207 if (processListenerDeath_ != nullptr) {
1208 listener->AsObject()->RemoveDeathRecipient(processListenerDeath_);
1209 }
1210 processListeners_.erase(iter);
1211 HILOGI("UnSubscribeSystemProcess listener remove success");
1212 } else {
1213 HILOGI("UnSubscribeSystemProcess listener not exists");
1214 }
1215 return ERR_OK;
1216 }
1217
IsSystemProcessNeverStartedLocked(const std::u16string & processName)1218 bool SystemAbilityStateScheduler::IsSystemProcessNeverStartedLocked(const std::u16string& processName)
1219 {
1220 std::shared_ptr<SystemProcessContext> processContext;
1221 if (!GetSystemProcessContext(processName, processContext)) {
1222 return true;
1223 }
1224 return processContext->pid < 0;
1225 }
1226
ProcessDelayUnloadEvent(int32_t systemAbilityId)1227 int32_t SystemAbilityStateScheduler::ProcessDelayUnloadEvent(int32_t systemAbilityId)
1228 {
1229 std::shared_ptr<SystemAbilityContext> abilityContext;
1230 if (!GetSystemAbilityContext(systemAbilityId, abilityContext)) {
1231 return GET_SA_CONTEXT_FAIL;
1232 }
1233 std::lock_guard<std::mutex> autoLock(abilityContext->ownProcessContext->processLock);
1234 return ProcessDelayUnloadEventLocked(systemAbilityId);
1235 }
1236
ProcessDelayUnloadEventLocked(int32_t systemAbilityId)1237 int32_t SystemAbilityStateScheduler::ProcessDelayUnloadEventLocked(int32_t systemAbilityId)
1238 {
1239 std::shared_ptr<SystemAbilityContext> abilityContext;
1240 if (!GetSystemAbilityContext(systemAbilityId, abilityContext)) {
1241 return GET_SA_CONTEXT_FAIL;
1242 }
1243 if (abilityContext->unloadRequest == nullptr) {
1244 HILOGE("Scheduler SA:%{public}d unloadRequest is null", abilityContext->systemAbilityId);
1245 return UNLOAD_REQUEST_NULL;
1246 }
1247 if (abilityContext->state != SystemAbilityState::LOADED) {
1248 HILOGW("Scheduler SA:%{public}d can't proc delay unload event", systemAbilityId);
1249 return ERR_OK;
1250 }
1251 HILOGI("Scheduler SA:%{public}d proc delay unload event", systemAbilityId);
1252 int32_t delayTime = 0;
1253 nlohmann::json idleReason;
1254 idleReason[KEY_EVENT_ID] = abilityContext->unloadRequest->unloadEvent.eventId;
1255 idleReason[KEY_NAME] = abilityContext->unloadRequest->unloadEvent.name;
1256 idleReason[KEY_VALUE] = abilityContext->unloadRequest->unloadEvent.value;
1257 idleReason[KEY_EXTRA_DATA_ID] = abilityContext->unloadRequest->unloadEvent.extraDataId;
1258 bool result = SystemAbilityManager::GetInstance()->IdleSystemAbility(abilityContext->systemAbilityId,
1259 abilityContext->ownProcessContext->processName, idleReason, delayTime);
1260 if (!result) {
1261 HILOGE("Scheduler SA:%{public}d idle fail", systemAbilityId);
1262 return IDLE_SA_FAIL;
1263 }
1264 if (delayTime < 0) {
1265 HILOGI("Scheduler SA:%{public}d reject unload", systemAbilityId);
1266 return ERR_OK;
1267 } else if (delayTime == 0) {
1268 HILOGI("Scheduler SA:%{public}d agree unload", systemAbilityId);
1269 return stateMachine_->AbilityStateTransitionLocked(abilityContext, SystemAbilityState::UNLOADABLE);
1270 } else {
1271 HILOGI("Scheduler SA:%{public}d choose delay unload", systemAbilityId);
1272 return SendDelayUnloadEventLocked(abilityContext->systemAbilityId, fmin(delayTime, MAX_DELAY_TIME));
1273 }
1274 }
1275
CheckEnableOnce(const OnDemandEvent & event,const std::list<SaControlInfo> & saControlList)1276 void SystemAbilityStateScheduler::CheckEnableOnce(const OnDemandEvent& event,
1277 const std::list<SaControlInfo>& saControlList)
1278 {
1279 sptr<ISystemAbilityLoadCallback> callback(new SystemAbilityLoadCallbackStub());
1280 for (auto& saControl : saControlList) {
1281 int32_t result = ERR_INVALID_VALUE;
1282 if (saControl.ondemandId == START_ON_DEMAND) {
1283 result = CheckStartEnableOnce(event, saControl, callback);
1284 } else if (saControl.ondemandId == STOP_ON_DEMAND) {
1285 result = CheckStopEnableOnce(event, saControl);
1286 } else {
1287 HILOGE("ondemandId error");
1288 }
1289 if (result != ERR_OK) {
1290 HILOGE("process ondemand event failed, ondemandId:%{public}d, SA:%{public}d",
1291 saControl.ondemandId, saControl.saId);
1292 }
1293 }
1294 }
1295
CheckStartEnableOnce(const OnDemandEvent & event,const SaControlInfo & saControl,sptr<ISystemAbilityLoadCallback> callback)1296 int32_t SystemAbilityStateScheduler::CheckStartEnableOnce(const OnDemandEvent& event,
1297 const SaControlInfo& saControl, sptr<ISystemAbilityLoadCallback> callback)
1298 {
1299 int32_t result = ERR_INVALID_VALUE;
1300 if (saControl.enableOnce) {
1301 lock_guard<mutex> autoLock(startEnableOnceLock_);
1302 auto iter = startEnableOnceMap_.find(saControl.saId);
1303 if (iter != startEnableOnceMap_.end() && SamgrUtil::IsSameEvent(event, startEnableOnceMap_[saControl.saId])) {
1304 HILOGI("ondemand canceled for enable-once, ondemandId:%{public}d, SA:%{public}d",
1305 saControl.ondemandId, saControl.saId);
1306 return result;
1307 }
1308 startEnableOnceMap_[saControl.saId].emplace_back(event);
1309 HILOGI("startEnableOnceMap_ add SA:%{public}d, eventId:%{public}d",
1310 saControl.saId, event.eventId);
1311 }
1312 auto callingPid = IPCSkeleton::GetCallingPid();
1313 LoadRequestInfo loadRequestInfo = {LOCAL_DEVICE, callback, saControl.saId, callingPid, event};
1314 result = HandleLoadAbilityEvent(loadRequestInfo);
1315 if (saControl.enableOnce && result != ERR_OK) {
1316 lock_guard<mutex> autoLock(startEnableOnceLock_);
1317 auto& events = startEnableOnceMap_[saControl.saId];
1318 events.remove(event);
1319 if (events.empty()) {
1320 startEnableOnceMap_.erase(saControl.saId);
1321 }
1322 HILOGI("startEnableOnceMap_remove SA:%{public}d, eventId:%{public}d",
1323 saControl.saId, event.eventId);
1324 }
1325 if (result != ERR_OK) {
1326 ReportSamgrSaLoadFail(saControl.saId, IPCSkeleton::GetCallingPid(), IPCSkeleton::GetCallingUid(),
1327 "ondemand load err:" + ToString(result));
1328 }
1329 return result;
1330 }
1331
CheckStopEnableOnce(const OnDemandEvent & event,const SaControlInfo & saControl)1332 int32_t SystemAbilityStateScheduler::CheckStopEnableOnce(const OnDemandEvent& event,
1333 const SaControlInfo& saControl)
1334 {
1335 int32_t result = ERR_INVALID_VALUE;
1336 if (saControl.enableOnce) {
1337 lock_guard<mutex> autoLock(stopEnableOnceLock_);
1338 auto iter = stopEnableOnceMap_.find(saControl.saId);
1339 if (iter != stopEnableOnceMap_.end() && SamgrUtil::IsSameEvent(event, stopEnableOnceMap_[saControl.saId])) {
1340 HILOGI("ondemand canceled for enable-once, ondemandId:%{public}d, SA:%{public}d",
1341 saControl.ondemandId, saControl.saId);
1342 return result;
1343 }
1344 stopEnableOnceMap_[saControl.saId].emplace_back(event);
1345 HILOGI("stopEnableOnceMap_ add SA:%{public}d, eventId:%{public}d",
1346 saControl.saId, event.eventId);
1347 }
1348 auto callingPid = IPCSkeleton::GetCallingPid();
1349 std::shared_ptr<UnloadRequestInfo> unloadRequestInfo =
1350 std::make_shared<UnloadRequestInfo>(event, saControl.saId, callingPid);
1351 result = HandleUnloadAbilityEvent(unloadRequestInfo);
1352 if (saControl.enableOnce && result != ERR_OK) {
1353 lock_guard<mutex> autoLock(stopEnableOnceLock_);
1354 auto& events = stopEnableOnceMap_[saControl.saId];
1355 events.remove(event);
1356 if (events.empty()) {
1357 stopEnableOnceMap_.erase(saControl.saId);
1358 }
1359 HILOGI("stopEnableOnceMap_ remove SA:%{public}d, eventId:%{public}d",
1360 saControl.saId, event.eventId);
1361 }
1362 if (result != ERR_OK) {
1363 ReportSaUnLoadFail(saControl.saId, IPCSkeleton::GetCallingPid(), IPCSkeleton::GetCallingUid(),
1364 "Ondemand unload err:" + ToString(result));
1365 }
1366 return result;
1367 }
1368
ProcessEvent(uint32_t eventId)1369 void SystemAbilityStateScheduler::UnloadEventHandler::ProcessEvent(uint32_t eventId)
1370 {
1371 int32_t systemAbilityId = static_cast<int32_t>(eventId);
1372 if (handler_ != nullptr) {
1373 HILOGD("ProcessEvent deltask SA:%{public}d", systemAbilityId);
1374 handler_->DelTask(std::to_string(eventId));
1375 } else {
1376 HILOGE("ProcessEvent handler_ is null");
1377 }
1378 auto stateScheduler = stateScheduler_.lock();
1379 int32_t result = ERR_OK;
1380 if (stateScheduler != nullptr) {
1381 result = stateScheduler->ProcessDelayUnloadEvent(systemAbilityId);
1382 }
1383 if (result != ERR_OK) {
1384 HILOGE("Scheduler SA:%{public}d proc delay unload event fail", systemAbilityId);
1385 }
1386 }
1387
SendEvent(uint32_t eventId,int64_t extraDataId,uint64_t delayTime)1388 bool SystemAbilityStateScheduler::UnloadEventHandler::SendEvent(uint32_t eventId,
1389 int64_t extraDataId, uint64_t delayTime)
1390 {
1391 if (handler_ == nullptr) {
1392 HILOGE("SystemAbilityStateScheduler SendEvent handler is null!");
1393 return false;
1394 }
1395 auto task = [this, eventId] {this->ProcessEvent(eventId);};
1396 return handler_->PostTask(task, std::to_string(eventId), delayTime);
1397 }
1398
RemoveEvent(uint32_t eventId)1399 void SystemAbilityStateScheduler::UnloadEventHandler::RemoveEvent(uint32_t eventId)
1400 {
1401 if (handler_ == nullptr) {
1402 HILOGE("SystemAbilityStateScheduler SendEvent handler is null!");
1403 return;
1404 }
1405 handler_->RemoveTask(std::to_string(eventId));
1406 }
1407
HasInnerEvent(uint32_t eventId)1408 bool SystemAbilityStateScheduler::UnloadEventHandler::HasInnerEvent(uint32_t eventId)
1409 {
1410 if (handler_ == nullptr) {
1411 HILOGE("SystemAbilityStateScheduler SendEvent handler is null!");
1412 return false;
1413 }
1414 return handler_->HasInnerEvent(std::to_string(eventId));
1415 }
1416
CleanFfrt()1417 void SystemAbilityStateScheduler::UnloadEventHandler::CleanFfrt()
1418 {
1419 if (handler_ != nullptr) {
1420 handler_->CleanFfrt();
1421 }
1422 }
1423
SetFfrt()1424 void SystemAbilityStateScheduler::UnloadEventHandler::SetFfrt()
1425 {
1426 if (handler_ != nullptr) {
1427 handler_->SetFfrt("UnloadEventHandler");
1428 }
1429 }
1430
1431 } // namespace OHOS