From 88825f3743eb0092e35ffe97c10dd6848ae350a8 Mon Sep 17 00:00:00 2001 From: wangdantong Date: Fri, 5 May 2023 06:18:23 +0000 Subject: [PATCH 1/2] =?UTF-8?q?=E9=9D=9E=E5=B8=B8=E9=A9=BB=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E8=BF=9B=E7=A8=8B=E6=81=A2=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wangdantong Change-Id: Ic1dabc85f2e0987202c8075305d46c40c6daa493 --- .../schedule/system_ability_state_scheduler.h | 2 + .../system_ability_state_scheduler.cpp | 67 ++++++++++++++++--- .../native/source/system_ability_manager.cpp | 2 +- 3 files changed, 59 insertions(+), 12 deletions(-) diff --git a/services/samgr/native/include/schedule/system_ability_state_scheduler.h b/services/samgr/native/include/schedule/system_ability_state_scheduler.h index 10765d6d..3e41e54f 100644 --- a/services/samgr/native/include/schedule/system_ability_state_scheduler.h +++ b/services/samgr/native/include/schedule/system_ability_state_scheduler.h @@ -38,10 +38,12 @@ public: virtual ~SystemAbilityStateScheduler() = default; void Init(const std::list& saProfiles); + int32_t HandleAbilityDiedEvent(int32_t systemAbilityId); int32_t HandleLoadAbilityEvent(const LoadRequestInfo& loadRequestInfo); int32_t HandleLoadAbilityEvent(int32_t systemAbilityId, bool& isExist); int32_t HandleUnloadAbilityEvent(const UnloadRequestInfo& unloadRequestInfo); int32_t HandleCancelUnloadAbilityEvent(int32_t systemAbilityId); + int32_t RestartAbnormallyDiedSystemAbilityLocked(const std::shared_ptr& abilityContext); int32_t SendAbilityStateEvent(int32_t systemAbilityId, AbilityStateEvent event); int32_t SendProcessStateEvent(const ProcessInfo& processInfo, ProcessStateEvent event); bool IsSystemAbilityUnloading(int32_t systemAbilityId); diff --git a/services/samgr/native/source/schedule/system_ability_state_scheduler.cpp b/services/samgr/native/source/schedule/system_ability_state_scheduler.cpp index 6914f7f3..d0b2364f 100644 --- a/services/samgr/native/source/schedule/system_ability_state_scheduler.cpp +++ b/services/samgr/native/source/schedule/system_ability_state_scheduler.cpp @@ -28,6 +28,7 @@ namespace OHOS { namespace { +constexpr int32_t DELAYTIME_100 = 100; constexpr int32_t MAX_SUBSCRIBE_COUNT = 256; constexpr int32_t UNLOAD_TIMEOUT_TIME = 5 * 1000; const std::string LOCAL_DEVICE = "local"; @@ -566,6 +567,42 @@ int32_t SystemAbilityStateScheduler::KillSystemProcessLocked( return ERR_OK; } +int32_t SystemAbilityStateScheduler::RestartAbnormallyDiedSystemAbilityLocked( +const std::shared_ptr& abilityContext) +{ + HILOGI("[SA Scheduler][sa: %{public}d] died abnormally", abilityContext->systemAbilityId); + switch (abilityContext->state) { + case SystemAbilityState::LOADING: + case SystemAbilityState::LOADED: + case SystemAbilityState::UNLOADABLE: { + HILOGI("[SA Scheduler][sa: %{public}d] restart abnormally died system ability locked", + abilityContext->systemAbilityId); + int32_t res1 = stateMachine_->AbilityStateTransitionLocked(abilityContext, SystemAbilityState::NOT_LOADED); + if (res1 != ERR_OK) { + return ERR_INVALID_VALUE; + } + processHandler_->PostTask([this, abilityContext] () { + sptr callback(new SystemAbilityLoadCallbackStub()); + OnDemandEvent onDemandEvent = {INTERFACE_CALL, "restart"}; + LoadRequestInfo loadRequestInfo = {abilityContext->systemAbilityId, + LOCAL_DEVICE, callback, -1, onDemandEvent}; + HandleLoadAbilityEvent(loadRequestInfo); + }, DELAYTIME_100); + break; + } + case SystemAbilityState::UNLOADING: { + int32_t res2 = stateMachine_->AbilityStateTransitionLocked(abilityContext, SystemAbilityState::NOT_LOADED); + if (res2 != ERR_OK) { + return ERR_INVALID_VALUE; + } + break; + } + default: + break; + } + return ERR_OK; +} + void SystemAbilityStateScheduler::OnProcessStartedLocked(const std::u16string& processName) { HILOGI("[SA Scheduler][process: %{public}s] started", Str16ToStr8(processName).c_str()); @@ -589,24 +626,32 @@ void SystemAbilityStateScheduler::OnProcessNotStartedLocked(const std::u16string if (!GetSystemProcessContext(processName, processContext)) { return; } + { + std::shared_lock readLock(listenerSetLock_); + for (auto& listener : processListeners_) { + if (listener->AsObject() != nullptr) { + SystemProcessInfo systemProcessInfo = {Str16ToStr8(processContext->processName), processContext->pid}; + listener->OnSystemProcessStopped(systemProcessInfo); + } + } + } for (auto& saId : processContext->saList) { std::shared_ptr abilityContext; if (!GetSystemAbilityContext(saId, abilityContext)) { - return; + continue; } - int32_t result = ERR_OK; - result = stateMachine_->AbilityStateTransitionLocked(abilityContext, SystemAbilityState::NOT_LOADED); - if (result == ERR_OK) { + if (abilityContext->state == SystemAbilityState::NOT_LOADED) { HandlePendingLoadEventLocked(abilityContext); + } else { + RestartAbnormallyDiedSystemAbilityLocked(abilityContext); } } - std::shared_lock readLock(listenerSetLock_); - for (auto& listener : processListeners_) { - if (listener->AsObject() != nullptr) { - SystemProcessInfo systemProcessInfo = {Str16ToStr8(processContext->processName), processContext->pid}; - listener->OnSystemProcessStopped(systemProcessInfo); - } - } +} + +int32_t SystemAbilityStateScheduler::HandleAbilityDiedEvent(int32_t systemAbilityId) +{ + HILOGI("[SA Scheduler][SA: %{public}d] handle ability died event", systemAbilityId); + return ERR_OK; } void SystemAbilityStateScheduler::OnAbilityNotLoadedLocked(int32_t systemAbilityId) diff --git a/services/samgr/native/source/system_ability_manager.cpp b/services/samgr/native/source/system_ability_manager.cpp index 6eee6ba2..0d0a1fb7 100644 --- a/services/samgr/native/source/system_ability_manager.cpp +++ b/services/samgr/native/source/system_ability_manager.cpp @@ -792,7 +792,7 @@ int32_t SystemAbilityManager::RemoveSystemAbility(const sptr& abi HILOGE("abilityStateScheduler is nullptr"); return ERR_INVALID_VALUE; } - abilityStateScheduler_->SendAbilityStateEvent(saId, AbilityStateEvent::ABILITY_UNLOAD_SUCCESS_EVENT); + abilityStateScheduler_->HandleAbilityDiedEvent(saId); SendSystemAbilityRemovedMsg(saId); } return ERR_OK; -- Gitee From 8bff34edd9a90ecf9d189321a006d86f5d2bda4b Mon Sep 17 00:00:00 2001 From: wangdantong Date: Fri, 5 May 2023 06:19:59 +0000 Subject: [PATCH 2/2] =?UTF-8?q?=E9=9D=9E=E5=B8=B8=E9=A9=BB=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E8=BF=9B=E7=A8=8B=E6=81=A2=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wangdantong Change-Id: I4c1d1828ac3ade46967943847b282c3b016c34bb --- .../schedule/system_ability_state_scheduler.h | 2 +- .../system_ability_state_scheduler.cpp | 30 +++++++------------ .../native/source/system_ability_manager.cpp | 2 +- 3 files changed, 13 insertions(+), 21 deletions(-) diff --git a/services/samgr/native/include/schedule/system_ability_state_scheduler.h b/services/samgr/native/include/schedule/system_ability_state_scheduler.h index 3e41e54f..29093732 100644 --- a/services/samgr/native/include/schedule/system_ability_state_scheduler.h +++ b/services/samgr/native/include/schedule/system_ability_state_scheduler.h @@ -43,7 +43,7 @@ public: int32_t HandleLoadAbilityEvent(int32_t systemAbilityId, bool& isExist); int32_t HandleUnloadAbilityEvent(const UnloadRequestInfo& unloadRequestInfo); int32_t HandleCancelUnloadAbilityEvent(int32_t systemAbilityId); - int32_t RestartAbnormallyDiedSystemAbilityLocked(const std::shared_ptr& abilityContext); + int32_t SendAbilityStateEvent(int32_t systemAbilityId, AbilityStateEvent event); int32_t SendProcessStateEvent(const ProcessInfo& processInfo, ProcessStateEvent event); bool IsSystemAbilityUnloading(int32_t systemAbilityId); diff --git a/services/samgr/native/source/schedule/system_ability_state_scheduler.cpp b/services/samgr/native/source/schedule/system_ability_state_scheduler.cpp index d0b2364f..6389ad9d 100644 --- a/services/samgr/native/source/schedule/system_ability_state_scheduler.cpp +++ b/services/samgr/native/source/schedule/system_ability_state_scheduler.cpp @@ -626,32 +626,24 @@ void SystemAbilityStateScheduler::OnProcessNotStartedLocked(const std::u16string if (!GetSystemProcessContext(processName, processContext)) { return; } - { - std::shared_lock readLock(listenerSetLock_); - for (auto& listener : processListeners_) { - if (listener->AsObject() != nullptr) { - SystemProcessInfo systemProcessInfo = {Str16ToStr8(processContext->processName), processContext->pid}; - listener->OnSystemProcessStopped(systemProcessInfo); - } - } - } for (auto& saId : processContext->saList) { std::shared_ptr abilityContext; if (!GetSystemAbilityContext(saId, abilityContext)) { - continue; + return; } - if (abilityContext->state == SystemAbilityState::NOT_LOADED) { + int32_t result = ERR_OK; + result = stateMachine_->AbilityStateTransitionLocked(abilityContext, SystemAbilityState::NOT_LOADED); + if (result == ERR_OK) { HandlePendingLoadEventLocked(abilityContext); - } else { - RestartAbnormallyDiedSystemAbilityLocked(abilityContext); } } -} - -int32_t SystemAbilityStateScheduler::HandleAbilityDiedEvent(int32_t systemAbilityId) -{ - HILOGI("[SA Scheduler][SA: %{public}d] handle ability died event", systemAbilityId); - return ERR_OK; + std::shared_lock readLock(listenerSetLock_); + for (auto& listener : processListeners_) { + if (listener->AsObject() != nullptr) { + SystemProcessInfo systemProcessInfo = {Str16ToStr8(processContext->processName), processContext->pid}; + listener->OnSystemProcessStopped(systemProcessInfo); + } + } } void SystemAbilityStateScheduler::OnAbilityNotLoadedLocked(int32_t systemAbilityId) diff --git a/services/samgr/native/source/system_ability_manager.cpp b/services/samgr/native/source/system_ability_manager.cpp index 0d0a1fb7..6eee6ba2 100644 --- a/services/samgr/native/source/system_ability_manager.cpp +++ b/services/samgr/native/source/system_ability_manager.cpp @@ -792,7 +792,7 @@ int32_t SystemAbilityManager::RemoveSystemAbility(const sptr& abi HILOGE("abilityStateScheduler is nullptr"); return ERR_INVALID_VALUE; } - abilityStateScheduler_->HandleAbilityDiedEvent(saId); + abilityStateScheduler_->SendAbilityStateEvent(saId, AbilityStateEvent::ABILITY_UNLOAD_SUCCESS_EVENT); SendSystemAbilityRemovedMsg(saId); } return ERR_OK; -- Gitee