started recording when logs get dropped
diff --git a/aos/build/aos.gyp b/aos/build/aos.gyp
index 12ac2a1..a0412c3 100644
--- a/aos/build/aos.gyp
+++ b/aos/build/aos.gyp
@@ -40,6 +40,7 @@
],
'dependencies': [
'<(AOS)/linux_code/ipc_lib/ipc_lib.gyp:queue',
+ '<(AOS)/common/common.gyp:time',
],
'export_dependent_settings': [
'<(AOS)/linux_code/ipc_lib/ipc_lib.gyp:queue',
diff --git a/aos/common/logging/logging_impl.h b/aos/common/logging/logging_impl.h
index 3d5b387..cc7225f 100644
--- a/aos/common/logging/logging_impl.h
+++ b/aos/common/logging/logging_impl.h
@@ -267,6 +267,14 @@
void FillInMessage(log_level level, const char *format, va_list ap,
LogMessage *message);
+static inline void FillInMessageVarargs(log_level level, LogMessage *message,
+ const char *format, ...) {
+ va_list ap;
+ va_start(ap, format);
+ FillInMessage(level, format, ap, message);
+ va_end(ap);
+}
+
// Prints message to output.
void PrintMessage(FILE *output, const LogMessage &message);
diff --git a/aos/linux_code/logging/linux_logging.cc b/aos/linux_code/logging/linux_logging.cc
index 0adce79..f539caa 100644
--- a/aos/linux_code/logging/linux_logging.cc
+++ b/aos/linux_code/logging/linux_logging.cc
@@ -14,27 +14,28 @@
#include "aos/common/die.h"
#include "aos/common/logging/logging_impl.h"
#include "aos/linux_code/ipc_lib/queue.h"
+#include "aos/common/time.h"
namespace aos {
namespace logging {
-namespace {
-
-RawQueue *queue;
-
-} // namespace
namespace linux_code {
namespace {
-class LinuxQueueLogImplementation : public LogImplementation {
- LogMessage *GetMessageOrDie() {
- LogMessage *message = static_cast<LogMessage *>(queue->GetMessage());
- if (message == NULL) {
- LOG(FATAL, "%p->GetMessage() failed\n", queue);
- } else {
- return message;
- }
- }
+RawQueue *queue = NULL;
+int dropped_messages = 0;
+::aos::time::Time dropped_start(0, 0);
+
+LogMessage *GetMessageOrDie() {
+ LogMessage *message = static_cast<LogMessage *>(queue->GetMessage());
+ if (message == NULL) {
+ LOG(FATAL, "%p->GetMessage() failed\n", queue);
+ } else {
+ return message;
+ }
+}
+
+class LinuxQueueLogImplementation : public LogImplementation {
virtual void DoLog(log_level level, const char *format, va_list ap) override {
LogMessage *message = GetMessageOrDie();
internal::FillInMessage(level, format, ap, message);
@@ -91,9 +92,26 @@
}
void Write(LogMessage *msg) {
- // TODO(brians): Keep track of if we overflow the queue.
- if (!queue->WriteMessage(msg, RawQueue::kOverride)) {
- LOG(FATAL, "writing failed\n");
+ if (__builtin_expect(dropped_messages > 0, 0)) {
+ LogMessage *dropped_message = GetMessageOrDie();
+ internal::FillInMessageVarargs(ERROR, dropped_message,
+ "%d logs starting at %f dropped\n",
+ dropped_messages, dropped_start.ToSeconds());
+ if (queue->WriteMessage(dropped_message, RawQueue::kNonBlock)) {
+ dropped_messages = 0;
+ } else {
+ // Don't even bother trying to write this message because it's not likely
+ // to work and it would be confusing to have one log in the middle of a
+ // string of failures get through.
+ ++dropped_messages;
+ return;
+ }
+ }
+ if (!queue->WriteMessage(msg, RawQueue::kNonBlock)) {
+ if (dropped_messages == 0) {
+ dropped_start = ::aos::time::Time::Now();
+ }
+ ++dropped_messages;
}
}
diff --git a/aos/linux_code/logging/linux_logging.h b/aos/linux_code/logging/linux_logging.h
index 928a480..3dc8763 100644
--- a/aos/linux_code/logging/linux_logging.h
+++ b/aos/linux_code/logging/linux_logging.h
@@ -10,7 +10,7 @@
// Calls AddImplementation to register the usual linux logging implementation
// which sends the messages through a queue. This implementation relies on
// another process(es) to read the log messages that it puts into the queue.
-// It gets called by aos::Init*.
+// This function is usually called by aos::Init*.
void Register();
// Fairly simple wrappers around the raw queue calls.