blob: 985577b0188a64cf941624e1b089cbbe7067f011 [file] [log] [blame]
Brian Silverman14fd0fb2014-01-14 21:42:01 -08001#include "aos/linux_code/logging/linux_logging.h"
Brian Silvermanf665d692013-02-17 22:11:39 -08002
3#include <stdarg.h>
4#include <stdio.h>
5#include <string.h>
6#include <time.h>
7#include <sys/types.h>
8#include <errno.h>
9#include <unistd.h>
10#include <limits.h>
Brian Silvermanf665d692013-02-17 22:11:39 -080011
12#include <algorithm>
13
14#include "aos/common/die.h"
15#include "aos/common/logging/logging_impl.h"
Brian Silverman14fd0fb2014-01-14 21:42:01 -080016#include "aos/linux_code/ipc_lib/queue.h"
Brian Silvermanf665d692013-02-17 22:11:39 -080017
18namespace aos {
19namespace logging {
20namespace {
21
Brian Silverman08661c72013-09-01 17:24:38 -070022RawQueue *queue;
Brian Silvermanf665d692013-02-17 22:11:39 -080023
24} // namespace
Brian Silverman14fd0fb2014-01-14 21:42:01 -080025namespace linux_code {
Brian Silvermanf665d692013-02-17 22:11:39 -080026namespace {
27
Brian Silverman14fd0fb2014-01-14 21:42:01 -080028class linuxQueueLogImplementation : public LogImplementation {
Brian Silvermanf665d692013-02-17 22:11:39 -080029 virtual void DoLog(log_level level, const char *format, va_list ap) {
Brian Silvermana6d1b562013-09-01 14:39:39 -070030 LogMessage *message = static_cast<LogMessage *>(queue->GetMessage());
Brian Silvermanf665d692013-02-17 22:11:39 -080031 if (message == NULL) {
32 LOG(FATAL, "queue get message failed\n");
33 }
34
35 internal::FillInMessage(level, format, ap, message);
36
37 Write(message);
38 }
39};
40
41} // namespace
42
43void Register() {
44 Init();
45
Brian Silverman08661c72013-09-01 17:24:38 -070046 queue = RawQueue::Fetch("LoggingQueue", sizeof(LogMessage), 1323, 1500);
Brian Silvermanf665d692013-02-17 22:11:39 -080047 if (queue == NULL) {
48 Die("logging: couldn't fetch queue\n");
49 }
50
Brian Silverman14fd0fb2014-01-14 21:42:01 -080051 AddImplementation(new linuxQueueLogImplementation());
Brian Silvermanf665d692013-02-17 22:11:39 -080052}
53
54const LogMessage *ReadNext(int flags, int *index) {
Brian Silvermana6d1b562013-09-01 14:39:39 -070055 return static_cast<const LogMessage *>(queue->ReadMessageIndex(flags, index));
Brian Silvermanf665d692013-02-17 22:11:39 -080056}
57
58const LogMessage *ReadNext() {
Brian Silverman08661c72013-09-01 17:24:38 -070059 return ReadNext(RawQueue::kBlock);
Brian Silvermanf665d692013-02-17 22:11:39 -080060}
61
62const LogMessage *ReadNext(int flags) {
63 const LogMessage *r = NULL;
64 do {
Brian Silvermana6d1b562013-09-01 14:39:39 -070065 r = static_cast<const LogMessage *>(queue->ReadMessage(flags));
Brian Silvermanf665d692013-02-17 22:11:39 -080066 // not blocking means return a NULL if that's what it gets
Brian Silverman08661c72013-09-01 17:24:38 -070067 } while ((flags & RawQueue::kBlock) && r == NULL);
Brian Silvermanf665d692013-02-17 22:11:39 -080068 return r;
69}
70
71LogMessage *Get() {
Brian Silvermana6d1b562013-09-01 14:39:39 -070072 return static_cast<LogMessage *>(queue->GetMessage());
Brian Silvermanf665d692013-02-17 22:11:39 -080073}
74
75void Free(const LogMessage *msg) {
Brian Silvermana6d1b562013-09-01 14:39:39 -070076 queue->FreeMessage(msg);
Brian Silvermanf665d692013-02-17 22:11:39 -080077}
78
79void Write(LogMessage *msg) {
Brian Silverman08661c72013-09-01 17:24:38 -070080 if (!queue->WriteMessage(msg, RawQueue::kOverride)) {
Brian Silvermanf665d692013-02-17 22:11:39 -080081 LOG(FATAL, "writing failed");
82 }
83}
84
Brian Silverman14fd0fb2014-01-14 21:42:01 -080085} // namespace linux_code
Brian Silvermanf665d692013-02-17 22:11:39 -080086} // namespace logging
87} // namespace aos