diff --git a/sa_profile/4801.json b/sa_profile/4801.json index 8651af7099a565398d4effb3d211b4e25d6f4800..ee14333b7f3fc43cd44d440d70f6bae549aca815 100644 --- a/sa_profile/4801.json +++ b/sa_profile/4801.json @@ -13,6 +13,14 @@ "name":"usual.event.BOOT_COMPLETED" } ] + }, + "stop-on-demand": { + "param": [ + { + "name": "resourceschedule.memmgr.low.memory.prepare", + "value": "true" + } + ] } } ] diff --git a/services/distributedhardwarefwkservice/include/distributed_hardware_manager_factory.h b/services/distributedhardwarefwkservice/include/distributed_hardware_manager_factory.h index f821511191b39a9c328c60ddd7ab4e9ffa9b435b..3eb5557737184df42579d4630e563ea81db3cc1a 100644 --- a/services/distributedhardwarefwkservice/include/distributed_hardware_manager_factory.h +++ b/services/distributedhardwarefwkservice/include/distributed_hardware_manager_factory.h @@ -42,6 +42,8 @@ public: int Dump(const std::vector &argsStr, std::string &result); void UnInit(); bool GetUnInitFlag(); + void SetSAProcessState(bool saState); + bool GetSAProcessState(); private: bool Init(); void CheckExitSAOrNot(); @@ -52,6 +54,7 @@ private: std::atomic flagUnInit_ = false; std::atomic releaseStatus_ = false; std::mutex releaseProcessMutex_; + std::atomic isIdle_ = false; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/distributedhardwarefwkservice/include/distributed_hardware_service.h b/services/distributedhardwarefwkservice/include/distributed_hardware_service.h index 840a09fea6165a27eae840793787903b422b5a2d..72521d743b59f3283a4e691ca52751c707c3f1fa 100644 --- a/services/distributedhardwarefwkservice/include/distributed_hardware_service.h +++ b/services/distributedhardwarefwkservice/include/distributed_hardware_service.h @@ -68,6 +68,7 @@ public: protected: void OnStart() override; void OnStop() override; + int32_t OnIdle(const SystemAbilityOnDemandReason& idleReason) override; private: bool Init(); diff --git a/services/distributedhardwarefwkservice/src/distributed_hardware_manager_factory.cpp b/services/distributedhardwarefwkservice/src/distributed_hardware_manager_factory.cpp index cf45d7224796eba47c786adde48394dca0d26bfd..ae1f57c35f39ffa656870ceae4198205ca19e9e9 100644 --- a/services/distributedhardwarefwkservice/src/distributed_hardware_manager_factory.cpp +++ b/services/distributedhardwarefwkservice/src/distributed_hardware_manager_factory.cpp @@ -115,6 +115,7 @@ void DistributedHardwareManagerFactory::UnInit() void DistributedHardwareManagerFactory::ExitDHFWK() { DHLOGI("No device online or deviceList is over size, exit sa process"); + SetSAProcessState(true); HiSysEventWriteMsg(DHFWK_EXIT_END, OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR, "dhfwk sa exit end."); auto systemAbilityMgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); @@ -267,5 +268,16 @@ void DistributedHardwareManagerFactory::ClearRemoteDeviceLocalInfoData(const std { LocalCapabilityInfoManager::GetInstance()->ClearRemoteDeviceLocalInfoData(peeruuid); } + +void DistributedHardwareManagerFactory::SetSAProcessState(bool saState) +{ + DHLOGI("Set SA process state: %{public}d", saState); + isIdle_.store(saState); +} + +bool DistributedHardwareManagerFactory::GetSAProcessState() +{ + return isIdle_.load(); +} } // namespace DistributedHardware } // namespace OHOS diff --git a/services/distributedhardwarefwkservice/src/distributed_hardware_service.cpp b/services/distributedhardwarefwkservice/src/distributed_hardware_service.cpp index bba3c2785c01014042e42363dbf1b6484295a3a1..0781ac12bc8b6901d9f00f7b7f54a22b586b9b30 100644 --- a/services/distributedhardwarefwkservice/src/distributed_hardware_service.cpp +++ b/services/distributedhardwarefwkservice/src/distributed_hardware_service.cpp @@ -51,6 +51,8 @@ namespace DistributedHardware { #define DH_LOG_TAG "DistributedHardwareService" REGISTER_SYSTEM_ABILITY_BY_ID(DistributedHardwareService, DISTRIBUTED_HARDWARE_SA_ID, true); namespace { + constexpr int32_t SA_READY_TO_UNLOAD = 0; + constexpr int32_t SA_REFUSE_TO_UNLOAD = -1; constexpr int32_t INIT_BUSINESS_DELAY_TIME_MS = 5 * 100; const std::string INIT_TASK_ID = "CheckAndInitDH"; const std::string LOCAL_NETWORKID_ALIAS = "local"; @@ -76,6 +78,7 @@ void DistributedHardwareService::OnStart() return; } state_ = ServiceRunningState::STATE_RUNNING; + DistributedHardwareManagerFactory::GetInstance().SetSAProcessState(false); DHLOGI("DistributedHardwareService::OnStart start service success."); } @@ -164,6 +167,14 @@ void DistributedHardwareService::OnStop() registerToService_ = false; } +int32_t DistributedHardwareService::OnIdle(const SystemAbilityOnDemandReason& idleReason) +{ + bool saState = DistributedHardwareManagerFactory::GetInstance().GetSAProcessState(); + DHLOGI("OnIdle, idleReason name: %{public}s, id: %{public}d, value: %{public}s, sa process state: %{public}d", + idleReason.GetName().c_str(), idleReason.GetId(), idleReason.GetValue().c_str(), saState); + return saState ? SA_READY_TO_UNLOAD : SA_REFUSE_TO_UNLOAD; +} + int32_t DistributedHardwareService::RegisterPublisherListener(const DHTopic topic, const sptr listener) {