blob: 676e3b76476707c8b24aeb07e02f8e7679a8ff61 [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 Silverman88471dc2014-02-15 22:35:42 -080028class LinuxQueueLogImplementation : public LogImplementation {
29 LogMessage *GetMessageOrDie() {
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) {
Brian Silverman88471dc2014-02-15 22:35:42 -080032 LOG(FATAL, "%p->GetMessage() failed\n", queue);
33 } else {
34 return message;
Brian Silvermanf665d692013-02-17 22:11:39 -080035 }
Brian Silverman88471dc2014-02-15 22:35:42 -080036 }
Brian Silvermanf665d692013-02-17 22:11:39 -080037
Brian Silverman88471dc2014-02-15 22:35:42 -080038 virtual void DoLog(log_level level, const char *format, va_list ap) override {
39 LogMessage *message = GetMessageOrDie();
Brian Silvermanf665d692013-02-17 22:11:39 -080040 internal::FillInMessage(level, format, ap, message);
Brian Silverman88471dc2014-02-15 22:35:42 -080041 Write(message);
42 }
Brian Silvermanf665d692013-02-17 22:11:39 -080043
Brian Silverman88471dc2014-02-15 22:35:42 -080044 virtual void LogStruct(log_level level, const ::std::string &message_string,
45 size_t size, const MessageType *type,
46 const ::std::function<size_t(char *)> &serialize)
47 override {
48 LogMessage *message = GetMessageOrDie();
49 internal::FillInMessageStructure(level, message_string, size, type,
50 serialize, message);
Brian Silvermanf665d692013-02-17 22:11:39 -080051 Write(message);
52 }
53};
54
55} // namespace
56
57void Register() {
58 Init();
59
Brian Silverman08661c72013-09-01 17:24:38 -070060 queue = RawQueue::Fetch("LoggingQueue", sizeof(LogMessage), 1323, 1500);
Brian Silvermanf665d692013-02-17 22:11:39 -080061 if (queue == NULL) {
62 Die("logging: couldn't fetch queue\n");
63 }
64
Brian Silverman88471dc2014-02-15 22:35:42 -080065 AddImplementation(new LinuxQueueLogImplementation());
Brian Silvermanf665d692013-02-17 22:11:39 -080066}
67
68const LogMessage *ReadNext(int flags, int *index) {
Brian Silvermana6d1b562013-09-01 14:39:39 -070069 return static_cast<const LogMessage *>(queue->ReadMessageIndex(flags, index));
Brian Silvermanf665d692013-02-17 22:11:39 -080070}
71
72const LogMessage *ReadNext() {
Brian Silverman08661c72013-09-01 17:24:38 -070073 return ReadNext(RawQueue::kBlock);
Brian Silvermanf665d692013-02-17 22:11:39 -080074}
75
76const LogMessage *ReadNext(int flags) {
77 const LogMessage *r = NULL;
78 do {
Brian Silvermana6d1b562013-09-01 14:39:39 -070079 r = static_cast<const LogMessage *>(queue->ReadMessage(flags));
Brian Silvermanf665d692013-02-17 22:11:39 -080080 // not blocking means return a NULL if that's what it gets
Brian Silverman08661c72013-09-01 17:24:38 -070081 } while ((flags & RawQueue::kBlock) && r == NULL);
Brian Silvermanf665d692013-02-17 22:11:39 -080082 return r;
83}
84
85LogMessage *Get() {
Brian Silvermana6d1b562013-09-01 14:39:39 -070086 return static_cast<LogMessage *>(queue->GetMessage());
Brian Silvermanf665d692013-02-17 22:11:39 -080087}
88
89void Free(const LogMessage *msg) {
Brian Silvermana6d1b562013-09-01 14:39:39 -070090 queue->FreeMessage(msg);
Brian Silvermanf665d692013-02-17 22:11:39 -080091}
92
93void Write(LogMessage *msg) {
Brian Silverman08661c72013-09-01 17:24:38 -070094 if (!queue->WriteMessage(msg, RawQueue::kOverride)) {
Brian Silvermanf665d692013-02-17 22:11:39 -080095 LOG(FATAL, "writing failed");
96 }
97}
98
Brian Silverman14fd0fb2014-01-14 21:42:01 -080099} // namespace linux_code
Brian Silvermanf665d692013-02-17 22:11:39 -0800100} // namespace logging
101} // namespace aos