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 6a727747fa979d85b934d5b886cb1f57647c225e..942a23e7ef5c259201f503eb541a33665ffa06e8 100644 --- a/services/samgr/native/include/schedule/system_ability_state_scheduler.h +++ b/services/samgr/native/include/schedule/system_ability_state_scheduler.h @@ -134,6 +134,8 @@ private: void OnAbilityUnloadableLocked(int32_t systemAbilityId) override; void OnProcessNotStartedLocked(const std::u16string& processName) override; void OnProcessStartedLocked(const std::u16string& processName) override; + void RemoveRunningProcessLocked(const std::shared_ptr& processContext); + void AddRunningProcessLocked(const std::shared_ptr& processContext); int32_t ActiveSystemAbilityLocked(const std::shared_ptr& abilityContext, const nlohmann::json& activeReason); @@ -172,6 +174,8 @@ private: std::map> startEnableOnceMap_; samgr::mutex stopEnableOnceLock_; std::map> stopEnableOnceMap_; + samgr::mutex runningProcessListLock_; + std::list runningProcessList_; }; } // namespace OHOS 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 f0662a553a5a470e9aa8f26e6bad6d9ddeab37f9..61c53836dcc401397de0097677e1ea49de5d3931 100644 --- a/services/samgr/native/source/schedule/system_ability_state_scheduler.cpp +++ b/services/samgr/native/source/schedule/system_ability_state_scheduler.cpp @@ -446,7 +446,15 @@ int32_t SystemAbilityStateScheduler::SendProcessStateEvent(const ProcessInfo& pr return ERR_INVALID_VALUE; } std::lock_guard autoLock(processContext->processLock); - return stateEventHandler_->HandleProcessEventLocked(processContext, processInfo, event); + int32_t ret = stateEventHandler_->HandleProcessEventLocked(processContext, processInfo, event); + if (ret == ERR_OK) { + if (event == ProcessStateEvent::PROCESS_STARTED_EVENT) { + AddRunningProcessLocked(processContext); + } else { + RemoveRunningProcessLocked(processContext); + } + } + return ret; } int32_t SystemAbilityStateScheduler::SendDelayUnloadEventLocked(uint32_t systemAbilityId, int32_t delayTime) @@ -1456,6 +1464,39 @@ bool SystemAbilityStateScheduler::IsSystemProcessCanUnload(const std::u16string& return CanUnloadAllSystemAbilityLocked(processContext); } +void SystemAbilityStateScheduler::RemoveRunningProcessLocked( + const std::shared_ptr& processContext) +{ + std::lock_guard autoLock(runningProcessListLock_); + auto it = std::find_if(runningProcessList_.begin(), runningProcessList_.end(), + [&](const SystemProcessInfo& systemProcessInfo) { + return systemProcessInfo.processName == Str16ToStr8(processContext->processName); + }); + if (it != runningProcessList_.end()) { + runningProcessList_.erase(it); + HILOGI("runningProcessList_ remove process:%{public}s", Str16ToStr8(processContext->processName).c_str()); + } +} + +void SystemAbilityStateScheduler::AddRunningProcessLocked( + const std::shared_ptr& processContext) +{ + std::lock_guard autoLock(runningProcessListLock_); + auto it = std::find_if(runningProcessList_.begin(), runningProcessList_.end(), + [&](const SystemProcessInfo& systemProcessInfo) { + return systemProcessInfo.processName == Str16ToStr8(processContext->processName); + }); + if (it == runningProcessList_.end()) { + SystemProcessInfo systemProcessInfo = {Str16ToStr8(processContext->processName), processContext->pid, + processContext->uid}; + runningProcessList_.emplace_back(std::move(systemProcessInfo)); + } else { + it->pid = processContext->pid; + it->uid = processContext->uid; + } + HILOGI("runningProcessList_ add process:%{public}s", Str16ToStr8(processContext->processName).c_str()); +} + void SystemAbilityStateScheduler::UnloadEventHandler::ProcessEvent(uint32_t eventId) { int32_t systemAbilityId = static_cast(eventId);