MOS Source Code
Loading...
Searching...
No Matches
syslog.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-3.0-or-later
2
4
8#include "proto/syslog.pb.h"
9
10#include <ansi_colors.h>
11#include <mos/compiler.h>
12#include <mos/mos_global.h>
13#include <mos_stdio.hpp>
14#include <pb_encode.h>
15
17
18static void do_print_syslog(const pb_syslog_message *msg, const debug_info_entry *feat)
19{
20 const LogLevel level = (LogLevel) msg->info.level;
22
23 if (level != LogLevel::UNSET)
24 {
25 lprintk(level, "\r\n");
26 if (feat)
27 lprintk(level, "%-10s | ", feat->name);
28
29#if MOS_CONFIG(MOS_PRINTK_WITH_TIMESTAMP)
30 lprintk(level, "%-16lu | ", msg->timestamp);
31#endif
32
33#if MOS_CONFIG(MOS_PRINTK_WITH_DATETIME)
34 lprintk(level, "%s | ", (const char *) platform_get_datetime_str());
35#endif
36
37#if MOS_CONFIG(MOS_PRINTK_WITH_CPU_ID)
38 lprintk(level, "cpu %2d | ", msg->cpu_id);
39#endif
40
41#if MOS_CONFIG(MOS_PRINTK_WITH_FILENAME)
42 lprintk(level, "%-15s | ", msg->info.source_location.filename);
43#endif
44
45#if MOS_CONFIG(MOS_PRINTK_WITH_THREAD_ID)
46 lprintk(level, "[t%d:%s]\t| ", msg->thread.tid, msg->thread.name);
47#endif
48 }
49
50 lprintk(level, "%s", msg->message);
51
53}
54
55long do_syslog(LogLevel level, const char *file, const char *func, int line, const debug_info_entry *feat, const char *fmt, ...)
56{
57 auto const thread = current_thread;
58 pb_syslog_message msg = {
59 .timestamp = platform_get_timestamp(),
60 .cpu_id = platform_current_cpu_id(),
61 };
62
63 msg.info.level = (syslog_level) level;
64 msg.info.featid = feat ? feat->id : 0;
65 msg.info.source_location.line = line;
68
69 if (thread)
70 {
71 msg.thread.tid = thread->tid;
72 msg.process.pid = thread->owner->pid;
73 strncpy(msg.thread.name, thread->name.c_str(), sizeof(msg.thread.name));
74 strncpy(msg.process.name, thread->owner->name.c_str(), sizeof(msg.process.name));
75 }
76
77 va_list args;
78 va_start(args, fmt);
79 vsnprintf(msg.message, sizeof(msg.message), fmt, args);
80 va_end(args);
81
82 do_print_syslog(&msg, feat);
83 return 0;
84}
85
87 : RefCounted(rcCore), //
90 feature(feature), //
91 level(level), //
92 should_print(!mos_debug_info_map[feature] || mos_debug_info_map[feature]->enabled) //
93{
95 {
96 pos++;
97 fmtbuffer[0] = '\n';
98 fmtbuffer[1] = '\0';
99 }
100
101 if (should_print && mos_debug_info_map[feature])
102 pos += snprintf(fmtbuffer.data() + pos, MOS_PRINTK_BUFFER_SIZE - pos, "%-10s | ", mos_debug_info_map[feature]->name);
103}
104
106{
107 if (GetRef() == 1)
108 {
109 if (!should_print)
110 return;
111
113 printk_console = consoles.front();
114
116 fmtbuffer[0] = '\0';
117 pos = -1;
118 }
119}
#define MOS_PRINTK_BUFFER_SIZE
Definition autoconf.h:19
char args[3][16]
Definition avr_io.c:16
std::array< Console *, 128 > consoles
Definition console.cpp:20
MOSAPI char * strncpy(char *__restrict dest, const char *__restrict src, size_t n)
MOSAPI int vsnprintf(char *__restrict buf, size_t size, const char *__restrict format, va_list args)
#define unlikely(x)
Definition mos_global.h:40
std::array< char, MOS_PRINTK_BUFFER_SIZE > SyslogBuffer
Definition syslog.hpp:38
#define current_thread
Definition platform.hpp:33
void print_to_console(Console *con, LogLevel loglevel, const char *message, size_t len)
Definition printk.cpp:68
void lprintk(LogLevel loglevel, const char *format,...)
Definition printk.cpp:104
u32 platform_current_cpu_id()
u64 platform_get_timestamp()
#define spinlock_acquire(lock)
Definition spinlock.hpp:64
#define spinlock_release(lock)
Definition spinlock.hpp:65
RefCounted(RCCore *rc_)
Definition refcount.hpp:27
size_t GetRef() const
Definition refcount.hpp:54
SyslogStreamWriter(DebugFeature feature, LogLevel level, RCCore *rcCore, SyslogBuffer &fmtbuffer)
Definition syslog.cpp:86
const DebugFeature feature
Definition syslog.hpp:122
const LogLevel level
Definition syslog.hpp:123
const bool should_print
Definition syslog.hpp:124
SyslogBuffer & fmtbuffer
Definition syslog.hpp:117
char name[32]
Definition syslog.pb.h:31
uint32_t pid
Definition syslog.pb.h:30
char filename[32]
Definition syslog.pb.h:35
char function[32]
Definition syslog.pb.h:37
pb_process process
Definition syslog.pb.h:51
uint64_t timestamp
Definition syslog.pb.h:47
char message[1024]
Definition syslog.pb.h:49
pb_syslog_source_info info
Definition syslog.pb.h:48
uint32_t cpu_id
Definition syslog.pb.h:52
pb_thread thread
Definition syslog.pb.h:50
syslog_level level
Definition syslog.pb.h:41
pb_source_location source_location
Definition syslog.pb.h:43
uint32_t tid
Definition syslog.pb.h:25
char name[32]
Definition syslog.pb.h:26
static spinlock_t global_syslog_lock
Definition syslog.cpp:16
static void do_print_syslog(const pb_syslog_message *msg, const debug_info_entry *feat)
Definition syslog.cpp:18
long do_syslog(LogLevel level, const char *file, const char *func, int line, const debug_info_entry *feat, const char *fmt,...)
Definition syslog.cpp:55
struct Console * printk_console
Definition printk.cpp:14
#define fmt(_fmt,...)
Definition syslog.hpp:161
LogLevel
Definition syslog.hpp:15
int snprintf(char *__restrict str, size_t size, const char *__restrict format,...)
Definition mos_stdio.cpp:16
syslog_level
Definition syslog.pb.h:13
datetime_str_t * platform_get_datetime_str(void)