started recording when logs get dropped
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.