From 88804f84aedcaec1f6abbc8ff9fdb69386cb7b73 Mon Sep 17 00:00:00 2001 From: yanghang Date: Mon, 14 Apr 2025 15:24:56 +0800 Subject: [PATCH] fix: power init strength Signed-off-by: yanghang --- services/native/include/power_mgr_service.h | 2 +- services/native/src/power_mgr_service.cpp | 13 ++++++- services/native/src/power_state_machine.cpp | 2 +- utils/param/BUILD.gn | 3 ++ utils/param/include/sysparam.h | 2 + utils/param/src/sysparam.cpp | 42 +++++++++++++++++++++ 6 files changed, 61 insertions(+), 3 deletions(-) diff --git a/services/native/include/power_mgr_service.h b/services/native/include/power_mgr_service.h index 5cbdf15e..e21d7c66 100644 --- a/services/native/include/power_mgr_service.h +++ b/services/native/include/power_mgr_service.h @@ -290,7 +290,7 @@ private: static constexpr uint32_t HALL_SAMPLING_RATE = 100000000; static constexpr const char* SETTING_POWER_WAKEUP_DOUBLE_KEY {"settings.power.wakeup_double_click"}; static std::atomic_bool isBootCompleted_; - + static std::atomic_bool isNeedPowerInit_; static void RegisterBootCompletedCallback(); static void PowerExternalAbilityInit(); static bool IsDeveloperMode(); diff --git a/services/native/src/power_mgr_service.cpp b/services/native/src/power_mgr_service.cpp index 286414cc..946f4907 100644 --- a/services/native/src/power_mgr_service.cpp +++ b/services/native/src/power_mgr_service.cpp @@ -77,6 +77,7 @@ constexpr uint64_t VIRTUAL_SCREEN_START_ID = 1000; auto pms = DelayedSpSingleton::GetInstance(); const bool G_REGISTER_RESULT = SystemAbility::MakeAndRegisterAbility(pms.GetRefPtr()); SysParam::BootCompletedCallback g_bootCompletedCallback; +static std::mutex powerInitMutex_; #ifdef POWER_PICKUP_ENABLE bool g_isPickUpOpen = false; #endif @@ -84,6 +85,7 @@ constexpr int32_t API18 = 18; } // namespace std::atomic_bool PowerMgrService::isBootCompleted_ = false; +std::atomic_bool PowerMgrService::isNeedPowerInit_ = false; #ifdef HAS_SENSORS_SENSOR_PART bool PowerMgrService::isInLidMode_ = false; #endif @@ -156,7 +158,13 @@ bool PowerMgrService::Init() void PowerMgrService::RegisterBootCompletedCallback() { + POWER_HILOGI(COMP_SVC, "plan to RegisterBootCompletedCallback."); g_bootCompletedCallback = []() { + std::lock_guard lock(powerInitMutex_); + if (!isNeedPowerInit_) { + POWER_HILOGW(COMP_SVC, "Power initialization is not required."); + return; + } POWER_HILOGI(COMP_SVC, "BootCompletedCallback triggered"); auto power = DelayedSpSingleton::GetInstance(); if (power == nullptr) { @@ -190,8 +198,9 @@ void PowerMgrService::RegisterBootCompletedCallback() PowerExternalAbilityInit(); power->KeepScreenOnInit(); isBootCompleted_ = true; + isNeedPowerInit_ = false; }; - SysParam::RegisterBootCompletedCallback(g_bootCompletedCallback); + SysParam::RegisterBootCompletedCallbackForPowerSa(g_bootCompletedCallback); } void PowerMgrService::PowerExternalAbilityInit() @@ -710,6 +719,8 @@ void PowerMgrService::OnAddSystemAbility(int32_t systemAbilityId, const std::str } } if (systemAbilityId == DISPLAY_MANAGER_SERVICE_ID) { + POWER_HILOGI(COMP_SVC, "get DISPLAY_MANAGER_SERVICE_ID"); + isNeedPowerInit_ = true; RegisterBootCompletedCallback(); } #ifdef MSDP_MOVEMENT_ENABLE diff --git a/services/native/src/power_state_machine.cpp b/services/native/src/power_state_machine.cpp index 6b964d28..5b59d8c3 100644 --- a/services/native/src/power_state_machine.cpp +++ b/services/native/src/power_state_machine.cpp @@ -268,7 +268,7 @@ void PowerStateMachine::StartSleepTimer(PowerState from) void PowerStateMachine::InitState() { - POWER_HILOGD(FEATURE_POWER_STATE, "Init power state"); + POWER_HILOGI(FEATURE_POWER_STATE, "Init power state"); if (IsScreenOn()) { #ifdef HAS_HIVIEWDFX_HISYSEVENT_PART HiSysEventWrite(HiviewDFX::HiSysEvent::Domain::DISPLAY, "SCREEN_STATE", diff --git a/utils/param/BUILD.gn b/utils/param/BUILD.gn index 458eff38..7dc9a5a8 100644 --- a/utils/param/BUILD.gn +++ b/utils/param/BUILD.gn @@ -34,8 +34,11 @@ ohos_shared_library("power_sysparam") { public_configs = [ ":public_config" ] + deps = [ "../ffrt:power_ffrt" ] + external_deps = [ "c_utils:utils", + "ffrt:libffrt", "hilog:libhilog", "init:libbeget_proxy", "init:libbegetutil", diff --git a/utils/param/include/sysparam.h b/utils/param/include/sysparam.h index dec02cc6..c3f8ea48 100644 --- a/utils/param/include/sysparam.h +++ b/utils/param/include/sysparam.h @@ -27,11 +27,13 @@ class SysParam { public: typedef void (* BootCompletedCallback)(); static void RegisterBootCompletedCallback(BootCompletedCallback&); + static void RegisterBootCompletedCallbackForPowerSa(BootCompletedCallback&); static int32_t GetIntValue(const std::string& key, int32_t def); private: static constexpr const char* KEY_BOOT_COMPLETED {"bootevent.boot.completed"}; static constexpr int32_t VALUE_MAX_LEN = 32; + static void LoopReadBootCompletedParameter(BootCompletedCallback& callback); }; } // namespace PowerMgr } // namespace OHOS diff --git a/utils/param/src/sysparam.cpp b/utils/param/src/sysparam.cpp index bc601206..2e0481b3 100644 --- a/utils/param/src/sysparam.cpp +++ b/utils/param/src/sysparam.cpp @@ -15,14 +15,39 @@ #include "sysparam.h" +#include "ffrt_utils.h" #include "power_log.h" #include "string_ex.h" #include "syspara/parameter.h" +#include "syspara/parameters.h" namespace OHOS { namespace PowerMgr { + +void SysParam::LoopReadBootCompletedParameter(BootCompletedCallback& callback) +{ + ffrt::submit([callback](void) -> void { + constexpr int32_t delayTimeMs = 50; + constexpr int32_t logInterval = 100; + int32_t totalCounts = 0; + int32_t count = 0; + while (!system::GetBoolParameter(KEY_BOOT_COMPLETED, false)) { + count++; + if (count >= logInterval) { + totalCounts++; + POWER_HILOGW(COMP_UTILS, "bootevent not fired! totalCounts =%{public}d", totalCounts); + count = 0; + } + ffrt::this_task::sleep_for(std::chrono::milliseconds(delayTimeMs)); + } + POWER_HILOGI(COMP_UTILS, "Get booteventCompleted true success!"); + callback(); + }); +} + void SysParam::RegisterBootCompletedCallback(BootCompletedCallback& callback) { + POWER_HILOGI(COMP_UTILS, "start to RegisterBootCompletedCallback"); int32_t ret = WatchParameter( KEY_BOOT_COMPLETED, [](const char* key, const char* value, void* context) { @@ -36,6 +61,23 @@ void SysParam::RegisterBootCompletedCallback(BootCompletedCallback& callback) } } +void SysParam::RegisterBootCompletedCallbackForPowerSa(BootCompletedCallback& callback) +{ + POWER_HILOGI(COMP_UTILS, "start to RegisterBootCompletedCallback for power SA"); + int32_t ret = WatchParameter( + KEY_BOOT_COMPLETED, + [](const char* key, const char* value, void* context) { + if (strcmp(value, "true") == 0) { + ((BootCompletedCallback)context)(); + } + }, + reinterpret_cast(callback)); + if (ret < 0) { + POWER_HILOGW(COMP_UTILS, "RegisterBootCompletedCallback for power SA failed, ret=%{public}d", ret); + } + LoopReadBootCompletedParameter(callback); +} + int32_t SysParam::GetIntValue(const std::string& key, int32_t def) { char value[VALUE_MAX_LEN] = {0}; -- Gitee