diff --git a/include/log/logger.h b/include/log/logger.h index ff70529fb7fa7aa573a5b1cea662b321762981b0..b3928a7135d91dbe165156dfe50600dbf372ccc0 100644 --- a/include/log/logger.h +++ b/include/log/logger.h @@ -163,6 +163,8 @@ int android_logger_set_prune_list(struct logger_list *logger_list, #define ANDROID_LOG_RDWR O_RDWR #define ANDROID_LOG_ACCMODE O_ACCMODE #define ANDROID_LOG_NONBLOCK O_NONBLOCK +#define ANDROID_LOG_WRAP 0x40000000 /* Block until buffer about to wrap */ +#define ANDROID_LOG_WRAP_DEFAULT_TIMEOUT 7200 /* 2 hour default */ #define ANDROID_LOG_PSTORE 0x80000000 struct logger_list *android_logger_list_alloc(int mode, diff --git a/liblog/README b/liblog/README index f29ac045b377108a647756427e997f5e86dd456f..df1e68c653e057ac4cd809c8dbce7e6e5ee061bd 100644 --- a/liblog/README +++ b/liblog/README @@ -116,6 +116,10 @@ DESCRIPTION code, otherwise the android_logger_list_read call will block for new entries. + The ANDROID_LOG_WRAP mode flag to the android_logger_list_alloc_time + signals logd to quiesce the reader until the buffer is about to prune + at the start time then proceed to dumping content. + The ANDROID_LOG_PSTORE mode flag to the android_logger_open is used to switch from the active logs to the persistent logs from before the last reboot. diff --git a/liblog/log_read.c b/liblog/log_read.c index cfc8a7aca929086e56fd2342618affdcc751db3a..fb8675779b5a0ddf72935969682b867fbb87f513 100644 --- a/liblog/log_read.c +++ b/liblog/log_read.c @@ -797,6 +797,14 @@ int android_logger_list_read(struct logger_list *logger_list, } if (logger_list->start.tv_sec || logger_list->start.tv_nsec) { + if (logger_list->mode & ANDROID_LOG_WRAP) { + // ToDo: alternate API to allow timeout to be adjusted. + ret = snprintf(cp, remaining, " timeout=%u", + ANDROID_LOG_WRAP_DEFAULT_TIMEOUT); + ret = min(ret, remaining); + remaining -= ret; + cp += ret; + } ret = snprintf(cp, remaining, " start=%" PRIu32 ".%09" PRIu32, logger_list->start.tv_sec, logger_list->start.tv_nsec);