diff --git a/selfdrive/logcatd/logcatd_android.cc b/selfdrive/logcatd/logcatd_android.cc index fabd299e13..f9e1fdca89 100644 --- a/selfdrive/logcatd/logcatd_android.cc +++ b/selfdrive/logcatd/logcatd_android.cc @@ -1,68 +1,57 @@ -#include -#include -#include -#include -#include -#include - #include #include #include -#include "common/timing.h" #include "common/util.h" #include "messaging.hpp" +#define LOG_ID_KERNEL (log_id_t)5 int main() { ExitHandler do_exit; - - // setup android logging - struct logger_list *logger_list = android_logger_list_alloc(ANDROID_LOG_RDONLY, 0, 0); - assert(logger_list); - struct logger *main_logger = android_logger_open(logger_list, LOG_ID_MAIN); - assert(main_logger); - struct logger *radio_logger = android_logger_open(logger_list, LOG_ID_RADIO); - assert(radio_logger); - struct logger *system_logger = android_logger_open(logger_list, LOG_ID_SYSTEM); - assert(system_logger); - struct logger *crash_logger = android_logger_open(logger_list, LOG_ID_CRASH); - assert(crash_logger); - struct logger *kernel_logger = android_logger_open(logger_list, (log_id_t)5); // LOG_ID_KERNEL - assert(kernel_logger); + log_time last_log_time = {}; PubMaster pm({"androidLog"}); - while (!do_exit) { - log_msg log_msg; - int err = android_logger_list_read(logger_list, &log_msg); - - if (err == -EAGAIN) { - util::sleep_for(500); - continue; - } else if (err <= 0) { - break; + // setup android logging + logger_list *loggers = last_log_time.tv_sec == 0 ? + android_logger_list_alloc(ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 0, 0) : + android_logger_list_alloc_time(ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, last_log_time, 0); + assert(loggers); + + const log_id_t log_ids[] = {LOG_ID_MAIN, LOG_ID_RADIO, LOG_ID_SYSTEM, LOG_ID_CRASH, LOG_ID_KERNEL}; + for (const auto &id : log_ids) { + struct logger *log = android_logger_open(loggers, id); + assert(log != nullptr); } - AndroidLogEntry entry; - err = android_log_processLogBuffer(&log_msg.entry_v1, &entry); - if (err < 0) { - continue; + while (!do_exit) { + log_msg log_msg; + int err = android_logger_list_read(loggers, &log_msg); + if (err <= 0) break; + + AndroidLogEntry entry; + err = android_log_processLogBuffer(&log_msg.entry_v1, &entry); + if (err == 0) { + last_log_time.tv_sec = entry.tv_sec; + last_log_time.tv_nsec = entry.tv_nsec; + + MessageBuilder msg; + auto androidEntry = msg.initEvent().initAndroidLog(); + androidEntry.setId(log_msg.id()); + androidEntry.setTs(entry.tv_sec * 1000000000ULL + entry.tv_nsec); + androidEntry.setPriority(entry.priority); + androidEntry.setPid(entry.pid); + androidEntry.setTid(entry.tid); + androidEntry.setTag(entry.tag); + androidEntry.setMessage(entry.message); + + pm.send("androidLog", msg); + } } - MessageBuilder msg; - auto androidEntry = msg.initEvent().initAndroidLog(); - androidEntry.setId(log_msg.id()); - androidEntry.setTs(entry.tv_sec * 1000000000ULL + entry.tv_nsec); - androidEntry.setPriority(entry.priority); - androidEntry.setPid(entry.pid); - androidEntry.setTid(entry.tid); - androidEntry.setTag(entry.tag); - androidEntry.setMessage(entry.message); - - pm.send("androidLog", msg); + android_logger_list_free(loggers); + util::sleep_for(500); } - - android_logger_list_free(logger_list); return 0; }