From c94236ccb168048fc1f755db37d1ba82fc250648 Mon Sep 17 00:00:00 2001 From: zhangjunxi Date: Wed, 22 Jun 2022 17:12:37 +0800 Subject: [PATCH 1/8] Signed-off-by: zhangjunxi Changes to be committed: modified: ../include/timer_manager.h modified: timer_manager.cpp --- services/timer/include/timer_manager.h | 1 + services/timer/src/timer_manager.cpp | 66 +++++++++++++++----------- 2 files changed, 39 insertions(+), 28 deletions(-) diff --git a/services/timer/include/timer_manager.h b/services/timer/include/timer_manager.h index e11b3db..45b33eb 100644 --- a/services/timer/include/timer_manager.h +++ b/services/timer/include/timer_manager.h @@ -86,6 +86,7 @@ private: std::shared_ptr FindFirstWakeupBatchLocked(); void SetLocked(int type, std::chrono::nanoseconds when); std::chrono::steady_clock::time_point ConvertToElapsed(std::chrono::milliseconds when, int type); + std::chrono::steady_clock::time_point GetBootTimeNs(); std::map> timerEntryMap_; std::default_random_engine random_; diff --git a/services/timer/src/timer_manager.cpp b/services/timer/src/timer_manager.cpp index b1627a4..f302414 100644 --- a/services/timer/src/timer_manager.cpp +++ b/services/timer/src/timer_manager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 Huawei Device Co., Ltd. + * Copyright (C) 2021 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -19,20 +19,16 @@ #include #include #include - -#include "bundle_mgr_interface.h" -#include "if_system_ability_manager.h" -#include "system_ability_definition.h" -#include "iservice_registry.h" +#include namespace OHOS { namespace MiscServices { using namespace std::chrono; -using namespace OHOS::AppExecFwk; namespace { static int TIME_CHANGED_BITS = 16; static uint32_t TIME_CHANGED_MASK = 1 << TIME_CHANGED_BITS; const int ONE_THOUSAND = 1000; +const int FIRST_APPLICATION_UID = 10000; const float_t BATCH_WINDOW_COE = 0.75; const auto MIN_FUTURITY = seconds(5); const auto ZERO_FUTURITY = seconds(0); @@ -42,6 +38,7 @@ const auto MAX_INTERVAL = hours(24 * 365); const auto INTERVAL_HOUR = hours(1); const auto INTERVAL_HALF_DAY = hours(12); const auto MIN_FUZZABLE_INTERVAL = milliseconds(10000); +const int NANO_TO_SECOND = 1000000000; } extern bool AddBatchLocked(std::vector> &list, const std::shared_ptr &batch); @@ -154,17 +151,10 @@ bool TimerManager::DestroyTimer(uint64_t timerNumber) bool TimerManager::IsSystemUid(int uid) { - auto systemAbilityManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); - if (systemAbilityManager == nullptr) { - TIME_HILOGD(TIME_MODULE_SERVICE, "GetSystemAbilityManager is null."); - return false; + if (uid < FIRST_APPLICATION_UID) { + return true; } - auto bundleMgrSa = systemAbilityManager->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID); - if (bundleMgrSa == nullptr) { - TIME_HILOGD(TIME_MODULE_SERVICE, "GetSystemAbility is null."); - return false; - } - return iface_cast(bundleMgrSa)->CheckIsSystemAppByUid(uid); + return false; } void TimerManager::SetHandler(uint64_t id, @@ -192,7 +182,7 @@ void TimerManager::SetHandler(uint64_t id, intervalDuration = MAX_INTERVAL; } - auto nowElapsed = steady_clock::now(); + auto nowElapsed = GetBootTimeNs(); auto nominalTrigger = ConvertToElapsed(milliseconds(triggerAtTime), type); if (nominalTrigger < nowElapsed) { TIME_HILOGI(TIME_MODULE_SERVICE, "invalid trigger time end."); @@ -279,7 +269,8 @@ void TimerManager::RemoveLocked(uint64_t id) void TimerManager::SetHandlerLocked(std::shared_ptr alarm, bool rebatching, bool doValidate) { - TIME_HILOGI(TIME_MODULE_SERVICE, "start rebatching= %{public}d, doValidate= %{public}d", rebatching, doValidate); + TIME_HILOGI(TIME_MODULE_SERVICE, "start"); + TIME_HILOGI(TIME_MODULE_SERVICE, "rebatching= %{public}d, doValidate= %{public}d", rebatching, doValidate); InsertAndBatchTimerLocked(std::move(alarm)); if (!rebatching) { RescheduleKernelTimerLocked(); @@ -299,7 +290,7 @@ void TimerManager::ReBatchAllTimersLocked(bool doValidate) TIME_HILOGI(TIME_MODULE_SERVICE, "start"); auto oldSet = alarmBatches_; alarmBatches_.clear(); - auto nowElapsed = steady_clock::now(); + auto nowElapsed = GetBootTimeNs(); for (const auto &batch : oldSet) { auto n = batch->Size(); for (unsigned int i = 0; i < n; i++) { @@ -336,20 +327,21 @@ void TimerManager::ReAddTimerLocked(std::shared_ptr timer, std::chrono::steady_clock::time_point TimerManager::ConvertToElapsed(std::chrono::milliseconds when, int type) { + auto bootTimePoint = GetBootTimeNs(); TIME_HILOGI(TIME_MODULE_SERVICE, "start"); if (type == RTC || type == RTC_WAKEUP) { auto systemTimeNow = system_clock::now().time_since_epoch(); auto offset = when - systemTimeNow; TIME_HILOGI(TIME_MODULE_SERVICE, "systemTimeNow : %{public}lld", systemTimeNow.count()); TIME_HILOGI(TIME_MODULE_SERVICE, "offset : %{public}lld", offset.count()); - return steady_clock::now() + offset; + return bootTimePoint + offset; } - auto bootTimeNow = steady_clock::now().time_since_epoch(); + auto bootTimeNow = bootTimePoint.time_since_epoch(); auto offset = when - bootTimeNow; TIME_HILOGI(TIME_MODULE_SERVICE, "bootTimeNow : %{public}lld", bootTimeNow.count()); TIME_HILOGI(TIME_MODULE_SERVICE, "offset : %{public}lld", offset.count()); TIME_HILOGI(TIME_MODULE_SERVICE, "end"); - return steady_clock::now() + offset; + return bootTimePoint + offset; } void TimerManager::TimerLooper() @@ -364,13 +356,14 @@ void TimerManager::TimerLooper() TIME_HILOGI(TIME_MODULE_SERVICE, "result= %{public}d", result); auto nowRtc = std::chrono::system_clock::now(); - auto nowElapsed = std::chrono::steady_clock::now(); + auto nowElapsed = GetBootTimeNs(); triggerList.clear(); if ((result & TIME_CHANGED_MASK) != 0) { TIME_HILOGI(TIME_MODULE_SERVICE, "time changed"); system_clock::time_point lastTimeChangeClockTime; system_clock::time_point expectedClockTime; + TIME_HILOGI(TIME_MODULE_SERVICE, "lock"); std::lock_guard lock(mutex_); lastTimeChangeClockTime = lastTimeChangeClockTime_; expectedClockTime = lastTimeChangeClockTime + (duration_cast(nowElapsed.time_since_epoch()) - @@ -378,6 +371,7 @@ void TimerManager::TimerLooper() if (lastTimeChangeClockTime == system_clock::time_point::min() || nowRtc < (expectedClockTime - milliseconds(ONE_THOUSAND)) || nowRtc > (expectedClockTime + milliseconds(ONE_THOUSAND))) { + TIME_HILOGI(TIME_MODULE_SERVICE, "Time changed notification from kernel; rebatching"); ReBatchAllTimers(); lastTimeChangeClockTime_ = nowRtc; lastTimeChangeRealtime_ = nowElapsed; @@ -404,6 +398,19 @@ TimerManager::~TimerManager() } } +steady_clock::time_point TimerManager::GetBootTimeNs() +{ + int64_t timeNow = -1; + struct timespec tv {}; + if (clock_gettime(CLOCK_BOOTTIME, &tv) < 0) { + return steady_clock::now(); + } + timeNow = tv.tv_sec * NANO_TO_SECOND + tv.tv_nsec; + steady_clock::time_point tp_epoch ((nanoseconds(timeNow))); + return tp_epoch; +} + + bool TimerManager::TriggerTimersLocked(std::vector> &triggerList, std::chrono::steady_clock::time_point nowElapsed) { @@ -411,8 +418,9 @@ bool TimerManager::TriggerTimersLocked(std::vector> & bool hasWakeup = false; while (!alarmBatches_.empty()) { auto batch = alarmBatches_.at(0); - TIME_HILOGI(TIME_MODULE_SERVICE, "batch->GetStart()= %{public}lld, nowElapsed= %{public}lld", - time_point_cast(batch->GetStart()).time_since_epoch().count(), + TIME_HILOGI(TIME_MODULE_SERVICE, "batch->GetStart()= %{public}lld", + time_point_cast(batch->GetStart()).time_since_epoch().count()); + TIME_HILOGI(TIME_MODULE_SERVICE, "nowElapsed= %{public}lld", time_point_cast(nowElapsed).time_since_epoch().count()); if (batch->GetStart() > nowElapsed) { TIME_HILOGI(TIME_MODULE_SERVICE, "break alarmBatches_.size= %{public}d", @@ -454,7 +462,8 @@ bool TimerManager::TriggerTimersLocked(std::vector> & void TimerManager::RescheduleKernelTimerLocked() { - TIME_HILOGI(TIME_MODULE_SERVICE, "start alarmBatches_.size= %{public}d", static_cast(alarmBatches_.size())); + TIME_HILOGI(TIME_MODULE_SERVICE, "start"); + TIME_HILOGI(TIME_MODULE_SERVICE, "alarmBatches_.size= %{public}d", static_cast(alarmBatches_.size())); auto nextNonWakeup = std::chrono::steady_clock::time_point::min(); if (!alarmBatches_.empty()) { auto firstWakeup = FindFirstWakeupBatchLocked(); @@ -493,7 +502,8 @@ std::shared_ptr TimerManager::FindFirstWakeupBatchLocked() void TimerManager::SetLocked(int type, std::chrono::nanoseconds when) { - TIME_HILOGI(TIME_MODULE_SERVICE, "start when.count= %{public}lld", when.count()); + TIME_HILOGI(TIME_MODULE_SERVICE, "start"); + TIME_HILOGI(TIME_MODULE_SERVICE, "when.count= %{public}lld", when.count()); handler_->Set(static_cast(type), when); TIME_HILOGI(TIME_MODULE_SERVICE, "end"); } From 1dac0fa45464757150e8327ca9760cc5845491fc Mon Sep 17 00:00:00 2001 From: zhangjunxi Date: Wed, 22 Jun 2022 17:52:14 +0800 Subject: [PATCH 2/8] Signed-off-by: zhangjunxi Changes to be committed: modified: services/timer/src/timer_manager.cpp --- services/timer/src/timer_manager.cpp | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/services/timer/src/timer_manager.cpp b/services/timer/src/timer_manager.cpp index f302414..246390b 100644 --- a/services/timer/src/timer_manager.cpp +++ b/services/timer/src/timer_manager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 Huawei Device Co., Ltd. + * Copyright (C) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -28,7 +28,6 @@ namespace { static int TIME_CHANGED_BITS = 16; static uint32_t TIME_CHANGED_MASK = 1 << TIME_CHANGED_BITS; const int ONE_THOUSAND = 1000; -const int FIRST_APPLICATION_UID = 10000; const float_t BATCH_WINDOW_COE = 0.75; const auto MIN_FUTURITY = seconds(5); const auto ZERO_FUTURITY = seconds(0); @@ -149,14 +148,6 @@ bool TimerManager::DestroyTimer(uint64_t timerNumber) return true; } -bool TimerManager::IsSystemUid(int uid) -{ - if (uid < FIRST_APPLICATION_UID) { - return true; - } - return false; -} - void TimerManager::SetHandler(uint64_t id, int type, uint64_t triggerAtTime, @@ -269,7 +260,6 @@ void TimerManager::RemoveLocked(uint64_t id) void TimerManager::SetHandlerLocked(std::shared_ptr alarm, bool rebatching, bool doValidate) { - TIME_HILOGI(TIME_MODULE_SERVICE, "start"); TIME_HILOGI(TIME_MODULE_SERVICE, "rebatching= %{public}d, doValidate= %{public}d", rebatching, doValidate); InsertAndBatchTimerLocked(std::move(alarm)); if (!rebatching) { @@ -502,7 +492,6 @@ std::shared_ptr TimerManager::FindFirstWakeupBatchLocked() void TimerManager::SetLocked(int type, std::chrono::nanoseconds when) { - TIME_HILOGI(TIME_MODULE_SERVICE, "start"); TIME_HILOGI(TIME_MODULE_SERVICE, "when.count= %{public}lld", when.count()); handler_->Set(static_cast(type), when); TIME_HILOGI(TIME_MODULE_SERVICE, "end"); From fe43ecd0689f848b15f4b56cdb0ba94c7d4f1901 Mon Sep 17 00:00:00 2001 From: zhangjunxi Date: Wed, 22 Jun 2022 17:55:08 +0800 Subject: [PATCH 3/8] Signed-off-by: zhangjunxi Changes to be committed: modified: services/timer/src/timer_manager.cpp --- services/timer/src/timer_manager.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/services/timer/src/timer_manager.cpp b/services/timer/src/timer_manager.cpp index 246390b..0276373 100644 --- a/services/timer/src/timer_manager.cpp +++ b/services/timer/src/timer_manager.cpp @@ -452,7 +452,6 @@ bool TimerManager::TriggerTimersLocked(std::vector> & void TimerManager::RescheduleKernelTimerLocked() { - TIME_HILOGI(TIME_MODULE_SERVICE, "start"); TIME_HILOGI(TIME_MODULE_SERVICE, "alarmBatches_.size= %{public}d", static_cast(alarmBatches_.size())); auto nextNonWakeup = std::chrono::steady_clock::time_point::min(); if (!alarmBatches_.empty()) { From 9b9cc1e2e6a4f9a08c905731980623c699200a7d Mon Sep 17 00:00:00 2001 From: zhangjunxi Date: Thu, 23 Jun 2022 08:43:18 +0800 Subject: [PATCH 4/8] Signed-off-by: zhangjunxi Changes to be committed: modified: services/timer/src/timer_manager.cpp --- services/timer/src/timer_manager.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/services/timer/src/timer_manager.cpp b/services/timer/src/timer_manager.cpp index 0276373..2dd9996 100644 --- a/services/timer/src/timer_manager.cpp +++ b/services/timer/src/timer_manager.cpp @@ -148,6 +148,21 @@ bool TimerManager::DestroyTimer(uint64_t timerNumber) return true; } +bool TimerManager::IsSystemUid(int uid) +{ + auto systemAbilityManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); + if (systemAbilityManager == nullptr) { + TIME_HILOGD(TIME_MODULE_SERVICE, "GetSystemAbilityManager is null."); + return false; + } + auto bundleMgrSa = systemAbilityManager->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID); + if (bundleMgrSa == nullptr) { + TIME_HILOGD(TIME_MODULE_SERVICE, "GetSystemAbility is null."); + return false; + } + return iface_cast(bundleMgrSa)->CheckIsSystemAppByUid(uid); +} + void TimerManager::SetHandler(uint64_t id, int type, uint64_t triggerAtTime, From 19adf84094c245be1ee995167e1cc615b9e2e442 Mon Sep 17 00:00:00 2001 From: zhangjunxi Date: Thu, 23 Jun 2022 08:47:14 +0800 Subject: [PATCH 5/8] Signed-off-by: zhangjunxi Changes to be committed: modified: services/timer/src/timer_manager.cpp --- services/timer/src/timer_manager.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/services/timer/src/timer_manager.cpp b/services/timer/src/timer_manager.cpp index 2dd9996..1bf7901 100644 --- a/services/timer/src/timer_manager.cpp +++ b/services/timer/src/timer_manager.cpp @@ -415,7 +415,6 @@ steady_clock::time_point TimerManager::GetBootTimeNs() return tp_epoch; } - bool TimerManager::TriggerTimersLocked(std::vector> &triggerList, std::chrono::steady_clock::time_point nowElapsed) { From afb6852397d28aa499771712f33beaa897a5a303 Mon Sep 17 00:00:00 2001 From: zhangjunxi Date: Thu, 23 Jun 2022 09:03:26 +0800 Subject: [PATCH 6/8] Signed-off-by: zhangjunxi Changes to be committed: modified: services/timer/src/timer_manager.cpp --- services/timer/src/timer_manager.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/services/timer/src/timer_manager.cpp b/services/timer/src/timer_manager.cpp index 1bf7901..c465895 100644 --- a/services/timer/src/timer_manager.cpp +++ b/services/timer/src/timer_manager.cpp @@ -19,11 +19,16 @@ #include #include #include +#include "bundle_mgr_interface.h" +#include "if_system_ability_manager.h" +#include "system_ability_definition.h" +#include "iservice_registry.h" #include namespace OHOS { namespace MiscServices { using namespace std::chrono; +using namespace OHOS::AppExecFwk; namespace { static int TIME_CHANGED_BITS = 16; static uint32_t TIME_CHANGED_MASK = 1 << TIME_CHANGED_BITS; From b21450118afe558adc6a88020b9b814083bdde41 Mon Sep 17 00:00:00 2001 From: zhangjunxi Date: Thu, 23 Jun 2022 09:40:38 +0800 Subject: [PATCH 7/8] Signed-off-by: zhangjunxi Changes to be committed: modified: services/timer/src/timer_manager.cpp --- services/timer/src/timer_manager.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/services/timer/src/timer_manager.cpp b/services/timer/src/timer_manager.cpp index c465895..ebe788c 100644 --- a/services/timer/src/timer_manager.cpp +++ b/services/timer/src/timer_manager.cpp @@ -19,11 +19,12 @@ #include #include #include +#include #include "bundle_mgr_interface.h" #include "if_system_ability_manager.h" #include "system_ability_definition.h" #include "iservice_registry.h" -#include + namespace OHOS { namespace MiscServices { From 0aad79177853ddc8bed9d8d5cfb423d7465ffd11 Mon Sep 17 00:00:00 2001 From: zhangjunxi Date: Thu, 23 Jun 2022 20:42:42 +0800 Subject: [PATCH 8/8] Signed-off-by: zhangjunxi Changes to be committed: modified: services/timer/src/timer_manager.cpp --- services/timer/src/timer_manager.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/services/timer/src/timer_manager.cpp b/services/timer/src/timer_manager.cpp index ebe788c..0d7afa7 100644 --- a/services/timer/src/timer_manager.cpp +++ b/services/timer/src/timer_manager.cpp @@ -25,7 +25,6 @@ #include "system_ability_definition.h" #include "iservice_registry.h" - namespace OHOS { namespace MiscServices { using namespace std::chrono; @@ -281,7 +280,7 @@ void TimerManager::RemoveLocked(uint64_t id) void TimerManager::SetHandlerLocked(std::shared_ptr alarm, bool rebatching, bool doValidate) { - TIME_HILOGI(TIME_MODULE_SERVICE, "rebatching= %{public}d, doValidate= %{public}d", rebatching, doValidate); + TIME_HILOGI(TIME_MODULE_SERVICE, "start rebatching= %{public}d, doValidate= %{public}d", rebatching, doValidate); InsertAndBatchTimerLocked(std::move(alarm)); if (!rebatching) { RescheduleKernelTimerLocked(); @@ -472,7 +471,7 @@ bool TimerManager::TriggerTimersLocked(std::vector> & void TimerManager::RescheduleKernelTimerLocked() { - TIME_HILOGI(TIME_MODULE_SERVICE, "alarmBatches_.size= %{public}d", static_cast(alarmBatches_.size())); + TIME_HILOGI(TIME_MODULE_SERVICE, "start alarmBatches_.size= %{public}d", static_cast(alarmBatches_.size())); auto nextNonWakeup = std::chrono::steady_clock::time_point::min(); if (!alarmBatches_.empty()) { auto firstWakeup = FindFirstWakeupBatchLocked(); @@ -511,7 +510,7 @@ std::shared_ptr TimerManager::FindFirstWakeupBatchLocked() void TimerManager::SetLocked(int type, std::chrono::nanoseconds when) { - TIME_HILOGI(TIME_MODULE_SERVICE, "when.count= %{public}lld", when.count()); + TIME_HILOGI(TIME_MODULE_SERVICE, "start when.count= %{public}lld", when.count()); handler_->Set(static_cast(type), when); TIME_HILOGI(TIME_MODULE_SERVICE, "end"); }