From 583aa303932a29cf4fb43b038a53077ca3612455 Mon Sep 17 00:00:00 2001 From: JingMatrix Date: Tue, 10 Dec 2024 11:45:43 +0100 Subject: [PATCH] Avoid start multiple log watchdog threads It is observed that `enableWatchDog` might be called after the manager activity is resumed without user's interaction, due to some unknown mechanism of preference refreshing. --- daemon/src/main/jni/logcat.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/daemon/src/main/jni/logcat.cpp b/daemon/src/main/jni/logcat.cpp index 0b95be6f..b5a5b715 100644 --- a/daemon/src/main/jni/logcat.cpp +++ b/daemon/src/main/jni/logcat.cpp @@ -113,7 +113,7 @@ private: static size_t PrintLogLine(const AndroidLogEntry &entry, FILE *out); - void EnsureLogWatchDog(); + void StartLogWatchDog(); JNIEnv *env_; jobject thiz_; @@ -243,9 +243,9 @@ void Logcat::ProcessBuffer(struct log_msg *buf) { } else if (msg == "!!refresh_verbose!!"sv) { RefreshFd(true); } else if (msg == "!!start_watchdog!!"sv) { + if (!enable_watchdog) StartLogWatchDog(); enable_watchdog = true; enable_watchdog.notify_one(); - EnsureLogWatchDog(); } else if (msg == "!!stop_watchdog!!"sv) { enable_watchdog = false; enable_watchdog.notify_one(); @@ -260,20 +260,21 @@ void Logcat::ProcessBuffer(struct log_msg *buf) { } } -void Logcat::EnsureLogWatchDog() { +void Logcat::StartLogWatchDog() { constexpr static auto kLogdSizeProp = "persist.logd.size"sv; constexpr static auto kLogdTagProp = "persist.log.tag"sv; constexpr static auto kLogdMainSizeProp = "persist.logd.size.main"sv; constexpr static auto kLogdCrashSizeProp = "persist.logd.size.crash"sv; constexpr static long kErr = -1; std::thread watchdog([this] { + Log("[LogWatchDog started]\n"); while (true) { enable_watchdog.wait(false); // Blocking current thread until enable_watchdog is true; auto logd_size = GetByteProp(kLogdSizeProp); auto logd_tag = GetStrProp(kLogdTagProp); auto logd_main_size = GetByteProp(kLogdMainSizeProp); auto logd_crash_size = GetByteProp(kLogdCrashSizeProp); - Log("[LogWatchDog started] log.tag: " + logd_tag + + Log("[LogWatchDog running] log.tag: " + logd_tag + "; logd.[default, main, crash].size: [" + std::to_string(logd_size) + "," + std::to_string(logd_main_size) + "," + std::to_string(logd_crash_size) + "]\n"); if (!logd_tag.empty() ||