diff --git a/frameworks/native/appkit/dfr/watchdog.cpp b/frameworks/native/appkit/dfr/watchdog.cpp index 1539aa153bc877c94828c0cf62a3deefad4eea20..3d0ba9810e697e1c5916b4e0de60fb9574b62187 100644 --- a/frameworks/native/appkit/dfr/watchdog.cpp +++ b/frameworks/native/appkit/dfr/watchdog.cpp @@ -52,6 +52,10 @@ std::shared_ptr Watchdog::appMainHandler_ = nullptr; OHOS::HiviewDFX::HiTraceId* Watchdog::hitraceId_ = nullptr; #endif +static constexpr const char* const CHECK_BACKGROUND_THREAD[] = { + "com.ohos.sceneboard" +}; + Watchdog::Watchdog() {} @@ -157,6 +161,10 @@ void Watchdog::SetBundleInfo(const std::string& bundleName, const std::string& b ChangeTimeOut(bundleName); } #endif + { + std::unique_lock lock(cvMutex_); + bundleName_.store(bundleName); + } } void Watchdog::SetBackgroundStatus(const bool isInBackground) @@ -171,6 +179,7 @@ void Watchdog::AllowReportEvent() std::unique_lock lock(cvMutex_); needReport_.store(true); isSixSecondEvent_.store(false); + backgroundReportCount_.store(0); watchdogReportCount_.store(0); } @@ -266,10 +275,15 @@ void Watchdog::ReportEvent() return; } - if (isInBackground_) { + if (isInBackground_ && backgroundReportCount_.load() < BACKGROUND_REPORT_COUNT_MAX) { + bool enableCheck = std::find(std::begin(CHECK_BACKGROUND_THREAD), std::end(CHECK_BACKGROUND_THREAD), + bundleName_) != std::end(CHECK_BACKGROUND_THREAD); + if (enableCheck) { + backgroundReportCount_++; + } TAG_LOGI(AAFwkTag::APPDFR, "In Background, thread may be blocked in, not report time" - "currTime: %{public}" PRIu64 ", lastTime: %{public}" PRIu64 "", - static_cast(now), static_cast(lastWatchTime_)); + "currTime: %{public}" PRIu64 ", lastTime: %{public}" PRIu64 ", enableCheck: %{public}d", + static_cast(now), static_cast(lastWatchTime_), enableCheck); return; } diff --git a/interfaces/kits/native/appkit/dfr/watchdog.h b/interfaces/kits/native/appkit/dfr/watchdog.h index 7b6b62095ad3ae74c5c388ecc6aeb876b134d0f1..23000c63d9a7a37947ce95551352bfe65653b0b9 100644 --- a/interfaces/kits/native/appkit/dfr/watchdog.h +++ b/interfaces/kits/native/appkit/dfr/watchdog.h @@ -122,11 +122,13 @@ private: std::atomic_bool isSixSecondEvent_ = false; std::atomic_bool isInBackground_ = true; std::atomic_bool isBgWorkingThread_ = false; + std::atomic_int backgroundReportCount_ = 0; std::atomic_int watchdogReportCount_ = 0; std::mutex cvMutex_; std::condition_variable cvWatchdog_; static std::shared_ptr appMainHandler_; int64_t lastWatchTime_ = 0; + std::string bundleName_; }; } // namespace AppExecFwk } // namespace OHOS diff --git a/test/unittest/dfr_test/watchdog_test/watchdog_test.cpp b/test/unittest/dfr_test/watchdog_test/watchdog_test.cpp index 1d89f5a6256cd641b7ff82b8d775530c6cf0c6fe..02e620362e3282df627540a1ebaff44adc85075d 100644 --- a/test/unittest/dfr_test/watchdog_test/watchdog_test.cpp +++ b/test/unittest/dfr_test/watchdog_test/watchdog_test.cpp @@ -531,5 +531,22 @@ HWTEST_F(WatchdogTest, WatchdogTest_SetHiTraceChainId_001, TestSize.Level1) EXPECT_TRUE(watchdog_->hitraceId_ != nullptr); } #endif + +/** + * @tc.number: WatchdogTest_CheckBgThread_000 + * @tc.desc: Verify that function ReportEvent. + */ +HWTEST_F(WatchdogTest, WatchdogTest_CheckBgThread_000, TestSize.Level1) +{ + watchdog_->isInBackground_.store(true); + watchdog_->bundleName_ = "com.ohos.sceneboard"; + watchdog_->lastWatchTime_ = std::chrono::duration_cast(std::chrono:: + system_clock::now().time_since_epoch()).count() - 3000; // 3000: test value + int count = 6; // 6: test value + for (int i = 0; i <= count; i++) { + watchdog_->ReportEvent(); + } + EXPECT_TRUE(watchdog_->backgroundReportCount_.load() >= count); +} } // namespace AppExecFwk } // namespace OHOS