Zephyr Project API  3.1.0
A Scalable Open Source RTOS
log_backend.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2018 Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6#ifndef ZEPHYR_INCLUDE_LOGGING_LOG_BACKEND_H_
7#define ZEPHYR_INCLUDE_LOGGING_LOG_BACKEND_H_
8
11#include <stdarg.h>
12#include <zephyr/sys/__assert.h>
13#include <zephyr/sys/util.h>
15
16#ifdef __cplusplus
17extern "C" {
18#endif
19
27/* Forward declaration of the log_backend type. */
28struct log_backend;
29
34 /* Logging v2 function. */
35 void (*process)(const struct log_backend *const backend,
36 union log_msg2_generic *msg);
37
38 /* DEPRECATED! Functions used for logging v1. */
39 void (*put)(const struct log_backend *const backend,
40 struct log_msg *msg);
41 void (*put_sync_string)(const struct log_backend *const backend,
42 struct log_msg_ids src_level, uint32_t timestamp,
43 const char *fmt, va_list ap);
44 void (*put_sync_hexdump)(const struct log_backend *const backend,
45 struct log_msg_ids src_level, uint32_t timestamp,
46 const char *metadata, const uint8_t *data, uint32_t len);
47
48 /* Functions used by v1 and v2 */
49 void (*dropped)(const struct log_backend *const backend, uint32_t cnt);
50 void (*panic)(const struct log_backend *const backend);
51 void (*init)(const struct log_backend *const backend);
52 int (*format_set)(const struct log_backend *const backend,
53 uint32_t log_type);
54};
55
60 void *ctx;
62 bool active;
63};
64
69 const struct log_backend_api *api;
71 const char *name;
73};
74
75extern const struct log_backend __log_backends_start[];
76extern const struct log_backend __log_backends_end[];
77
87#define LOG_BACKEND_DEFINE(_name, _api, _autostart, ...) \
88 static struct log_backend_control_block UTIL_CAT(backend_cb_, _name) = \
89 { \
90 COND_CODE_0(NUM_VA_ARGS_LESS_1(_, ##__VA_ARGS__), \
91 (), (.ctx = __VA_ARGS__,)) \
92 .id = 0, \
93 .active = false, \
94 }; \
95 static const STRUCT_SECTION_ITERABLE(log_backend, _name) = \
96 { \
97 .api = &_api, \
98 .cb = &UTIL_CAT(backend_cb_, _name), \
99 .name = STRINGIFY(_name), \
100 .autostart = _autostart \
101 }
102
103
112static inline void log_backend_put(const struct log_backend *const backend,
113 struct log_msg *msg)
114{
115 __ASSERT_NO_MSG(backend != NULL);
116 __ASSERT_NO_MSG(msg != NULL);
117 backend->api->put(backend, msg);
118}
119
129static inline void log_backend_msg2_process(
130 const struct log_backend *const backend,
131 union log_msg2_generic *msg)
132{
133 __ASSERT_NO_MSG(backend != NULL);
134 __ASSERT_NO_MSG(msg != NULL);
135 backend->api->process(backend, msg);
136}
137
138
151 const struct log_backend *const backend,
152 struct log_msg_ids src_level,
153 uint32_t timestamp, const char *fmt,
154 va_list ap)
155{
156 __ASSERT_NO_MSG(backend != NULL);
157
158 if (backend->api->put_sync_string) {
159 backend->api->put_sync_string(backend, src_level,
160 timestamp, fmt, ap);
161 }
162}
163
177 const struct log_backend *const backend,
178 struct log_msg_ids src_level,
179 uint32_t timestamp, const char *metadata,
180 const uint8_t *data, uint32_t len)
181{
182 __ASSERT_NO_MSG(backend != NULL);
183
184 if (backend->api->put_sync_hexdump) {
185 backend->api->put_sync_hexdump(backend, src_level, timestamp,
186 metadata, data, len);
187 }
188}
189
198static inline void log_backend_dropped(const struct log_backend *const backend,
199 uint32_t cnt)
200{
201 __ASSERT_NO_MSG(backend != NULL);
202
203 if (backend->api->dropped != NULL) {
204 backend->api->dropped(backend, cnt);
205 }
206}
207
213static inline void log_backend_panic(const struct log_backend *const backend)
214{
215 __ASSERT_NO_MSG(backend != NULL);
216 backend->api->panic(backend);
217}
218
227static inline void log_backend_id_set(const struct log_backend *const backend,
228 uint8_t id)
229{
230 __ASSERT_NO_MSG(backend != NULL);
231 backend->cb->id = id;
232}
233
242static inline uint8_t log_backend_id_get(const struct log_backend *const backend)
243{
244 __ASSERT_NO_MSG(backend != NULL);
245 return backend->cb->id;
246}
247
255static inline const struct log_backend *log_backend_get(uint32_t idx)
256{
257 return &__log_backends_start[idx];
258}
259
265static inline int log_backend_count_get(void)
266{
267 return __log_backends_end - __log_backends_start;
268}
269
276static inline void log_backend_activate(const struct log_backend *const backend,
277 void *ctx)
278{
279 __ASSERT_NO_MSG(backend != NULL);
280 backend->cb->ctx = ctx;
281 backend->cb->active = true;
282}
283
289static inline void log_backend_deactivate(
290 const struct log_backend *const backend)
291{
292 __ASSERT_NO_MSG(backend != NULL);
293 backend->cb->active = false;
294}
295
303static inline bool log_backend_is_active(
304 const struct log_backend *const backend)
305{
306 __ASSERT_NO_MSG(backend != NULL);
307 return backend->cb->active;
308}
309
310#ifndef CONFIG_LOG1
320static inline int log_backend_format_set(const struct log_backend *backend, uint32_t log_type)
321{
322 extern size_t log_format_table_size(void);
323
324 if ((size_t)log_type >= log_format_table_size()) {
325 return -EINVAL;
326 }
327
328 if (log_format_func_t_get(log_type) == NULL) {
329 return -EINVAL;
330 }
331
332 if (backend == NULL) {
333 return -EINVAL;
334 }
335
336 if (backend->api->format_set == NULL) {
337 return -ENOTSUP;
338 }
339
340 return backend->api->format_set(backend, log_type);
341}
342#endif
343
348#ifdef __cplusplus
349}
350#endif
351
352#endif /* ZEPHYR_INCLUDE_LOGGING_LOG_BACKEND_H_ */
static void log_backend_deactivate(const struct log_backend *const backend)
Deactivate backend.
Definition: log_backend.h:289
static void log_backend_activate(const struct log_backend *const backend, void *ctx)
Activate backend.
Definition: log_backend.h:276
static bool log_backend_is_active(const struct log_backend *const backend)
Check state of the backend.
Definition: log_backend.h:303
static void log_backend_put(const struct log_backend *const backend, struct log_msg *msg)
Put message with log entry to the backend.
Definition: log_backend.h:112
static void log_backend_msg2_process(const struct log_backend *const backend, union log_msg2_generic *msg)
Process message.
Definition: log_backend.h:129
static void log_backend_put_sync_string(const struct log_backend *const backend, struct log_msg_ids src_level, uint32_t timestamp, const char *fmt, va_list ap)
Synchronously process log message.
Definition: log_backend.h:150
static void log_backend_put_sync_hexdump(const struct log_backend *const backend, struct log_msg_ids src_level, uint32_t timestamp, const char *metadata, const uint8_t *data, uint32_t len)
Synchronously process log hexdump_message.
Definition: log_backend.h:176
static void log_backend_id_set(const struct log_backend *const backend, uint8_t id)
Set backend id.
Definition: log_backend.h:227
static void log_backend_dropped(const struct log_backend *const backend, uint32_t cnt)
Notify backend about dropped log messages.
Definition: log_backend.h:198
static int log_backend_format_set(const struct log_backend *backend, uint32_t log_type)
Set logging format.
Definition: log_backend.h:320
static int log_backend_count_get(void)
Get number of backends.
Definition: log_backend.h:265
static void log_backend_panic(const struct log_backend *const backend)
Reconfigure backend to panic mode.
Definition: log_backend.h:213
static uint8_t log_backend_id_get(const struct log_backend *const backend)
Get backend id.
Definition: log_backend.h:242
static const struct log_backend * log_backend_get(uint32_t idx)
Get backend.
Definition: log_backend.h:255
log_format_func_t log_format_func_t_get(uint32_t log_type)
Declaration of the get routine for function pointer table format_table.
#define EINVAL
Definition: errno.h:61
#define ENOTSUP
Definition: errno.h:115
__UINT32_TYPE__ uint32_t
Definition: stdint.h:90
__UINT8_TYPE__ uint8_t
Definition: stdint.h:88
Logger backend API.
Definition: log_backend.h:33
void(* panic)(const struct log_backend *const backend)
Definition: log_backend.h:50
void(* put_sync_string)(const struct log_backend *const backend, struct log_msg_ids src_level, uint32_t timestamp, const char *fmt, va_list ap)
Definition: log_backend.h:41
void(* dropped)(const struct log_backend *const backend, uint32_t cnt)
Definition: log_backend.h:49
void(* process)(const struct log_backend *const backend, union log_msg2_generic *msg)
Definition: log_backend.h:35
void(* put_sync_hexdump)(const struct log_backend *const backend, struct log_msg_ids src_level, uint32_t timestamp, const char *metadata, const uint8_t *data, uint32_t len)
Definition: log_backend.h:44
void(* init)(const struct log_backend *const backend)
Definition: log_backend.h:51
int(* format_set)(const struct log_backend *const backend, uint32_t log_type)
Definition: log_backend.h:52
void(* put)(const struct log_backend *const backend, struct log_msg *msg)
Definition: log_backend.h:39
Logger backend control block.
Definition: log_backend.h:59
uint8_t id
Definition: log_backend.h:61
bool active
Definition: log_backend.h:62
void * ctx
Definition: log_backend.h:60
Logger backend structure.
Definition: log_backend.h:68
const char * name
Definition: log_backend.h:71
const struct log_backend_api * api
Definition: log_backend.h:69
struct log_backend_control_block * cb
Definition: log_backend.h:70
bool autostart
Definition: log_backend.h:72
Part of log message header identifying source and level.
Definition: log_msg.h:85
Log message structure.
Definition: log_msg.h:139
static fdata_t data[2]
Definition: test_fifo_contexts.c:15
static void msg(uint64_t c64)
Definition: main.c:17
Definition: log_msg2.h:101
Misc utilities.