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.
This commit is contained in:
JingMatrix 2024-12-10 11:45:43 +01:00
parent e7a5835d8f
commit 583aa30393
1 changed files with 5 additions and 4 deletions

View File

@ -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() ||