Zephyr API Documentation  3.0.0
A Scalable Open Source RTOS
3.0.0
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
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
9#include <logging/log_msg.h>
10#include <logging/log_msg2.h>
11#include <stdarg.h>
12#include <sys/__assert.h>
13#include <sys/util.h>
14
15#ifdef __cplusplus
16extern "C" {
17#endif
18
26/* Forward declaration of the log_backend type. */
27struct log_backend;
28
33 /* Logging v2 function. */
34 void (*process)(const struct log_backend *const backend,
35 union log_msg2_generic *msg);
36
37 /* DEPRECATED! Functions used for logging v1. */
38 void (*put)(const struct log_backend *const backend,
39 struct log_msg *msg);
40 void (*put_sync_string)(const struct log_backend *const backend,
41 struct log_msg_ids src_level, uint32_t timestamp,
42 const char *fmt, va_list ap);
43 void (*put_sync_hexdump)(const struct log_backend *const backend,
44 struct log_msg_ids src_level, uint32_t timestamp,
45 const char *metadata, const uint8_t *data, uint32_t len);
46
47 /* Functions used by v1 and v2 */
48 void (*dropped)(const struct log_backend *const backend, uint32_t cnt);
49 void (*panic)(const struct log_backend *const backend);
50 void (*init)(const struct log_backend *const backend);
51};
52
57 void *ctx;
59 bool active;
60};
61
66 const struct log_backend_api *api;
68 const char *name;
70};
71
72extern const struct log_backend __log_backends_start[];
73extern const struct log_backend __log_backends_end[];
74
84#define LOG_BACKEND_DEFINE(_name, _api, _autostart, ...) \
85 static struct log_backend_control_block UTIL_CAT(backend_cb_, _name) = \
86 { \
87 COND_CODE_0(NUM_VA_ARGS_LESS_1(_, ##__VA_ARGS__), \
88 (), (.ctx = __VA_ARGS__,)) \
89 .id = 0, \
90 .active = false, \
91 }; \
92 static const STRUCT_SECTION_ITERABLE(log_backend, _name) = \
93 { \
94 .api = &_api, \
95 .cb = &UTIL_CAT(backend_cb_, _name), \
96 .name = STRINGIFY(_name), \
97 .autostart = _autostart \
98 }
99
100
109static inline void log_backend_put(const struct log_backend *const backend,
110 struct log_msg *msg)
111{
112 __ASSERT_NO_MSG(backend != NULL);
113 __ASSERT_NO_MSG(msg != NULL);
114 backend->api->put(backend, msg);
115}
116
126static inline void log_backend_msg2_process(
127 const struct log_backend *const backend,
128 union log_msg2_generic *msg)
129{
130 __ASSERT_NO_MSG(backend != NULL);
131 __ASSERT_NO_MSG(msg != NULL);
132 backend->api->process(backend, msg);
133}
134
135
148 const struct log_backend *const backend,
149 struct log_msg_ids src_level,
150 uint32_t timestamp, const char *fmt,
151 va_list ap)
152{
153 __ASSERT_NO_MSG(backend != NULL);
154
155 if (backend->api->put_sync_string) {
156 backend->api->put_sync_string(backend, src_level,
157 timestamp, fmt, ap);
158 }
159}
160
174 const struct log_backend *const backend,
175 struct log_msg_ids src_level,
176 uint32_t timestamp, const char *metadata,
177 const uint8_t *data, uint32_t len)
178{
179 __ASSERT_NO_MSG(backend != NULL);
180
181 if (backend->api->put_sync_hexdump) {
182 backend->api->put_sync_hexdump(backend, src_level, timestamp,
183 metadata, data, len);
184 }
185}
186
195static inline void log_backend_dropped(const struct log_backend *const backend,
196 uint32_t cnt)
197{
198 __ASSERT_NO_MSG(backend != NULL);
199
200 if (backend->api->dropped != NULL) {
201 backend->api->dropped(backend, cnt);
202 }
203}
204
210static inline void log_backend_panic(const struct log_backend *const backend)
211{
212 __ASSERT_NO_MSG(backend != NULL);
213 backend->api->panic(backend);
214}
215
224static inline void log_backend_id_set(const struct log_backend *const backend,
225 uint8_t id)
226{
227 __ASSERT_NO_MSG(backend != NULL);
228 backend->cb->id = id;
229}
230
239static inline uint8_t log_backend_id_get(const struct log_backend *const backend)
240{
241 __ASSERT_NO_MSG(backend != NULL);
242 return backend->cb->id;
243}
244
252static inline const struct log_backend *log_backend_get(uint32_t idx)
253{
254 return &__log_backends_start[idx];
255}
256
262static inline int log_backend_count_get(void)
263{
264 return __log_backends_end - __log_backends_start;
265}
266
273static inline void log_backend_activate(const struct log_backend *const backend,
274 void *ctx)
275{
276 __ASSERT_NO_MSG(backend != NULL);
277 backend->cb->ctx = ctx;
278 backend->cb->active = true;
279}
280
286static inline void log_backend_deactivate(
287 const struct log_backend *const backend)
288{
289 __ASSERT_NO_MSG(backend != NULL);
290 backend->cb->active = false;
291}
292
300static inline bool log_backend_is_active(
301 const struct log_backend *const backend)
302{
303 __ASSERT_NO_MSG(backend != NULL);
304 return backend->cb->active;
305}
306
311#ifdef __cplusplus
312}
313#endif
314
315#endif /* ZEPHYR_INCLUDE_LOGGING_LOG_BACKEND_H_ */
static void log_backend_deactivate(const struct log_backend *const backend)
Deactivate backend.
Definition: log_backend.h:286
static void log_backend_activate(const struct log_backend *const backend, void *ctx)
Activate backend.
Definition: log_backend.h:273
static bool log_backend_is_active(const struct log_backend *const backend)
Check state of the backend.
Definition: log_backend.h:300
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:109
static void log_backend_msg2_process(const struct log_backend *const backend, union log_msg2_generic *msg)
Process message.
Definition: log_backend.h:126
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:147
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:173
static void log_backend_id_set(const struct log_backend *const backend, uint8_t id)
Set backend id.
Definition: log_backend.h:224
static void log_backend_dropped(const struct log_backend *const backend, uint32_t cnt)
Notify backend about dropped log messages.
Definition: log_backend.h:195
static int log_backend_count_get(void)
Get number of backends.
Definition: log_backend.h:262
static void log_backend_panic(const struct log_backend *const backend)
Reconfigure backend to panic mode.
Definition: log_backend.h:210
static uint8_t log_backend_id_get(const struct log_backend *const backend)
Get backend id.
Definition: log_backend.h:239
static const struct log_backend * log_backend_get(uint32_t idx)
Get backend.
Definition: log_backend.h:252
__UINT32_TYPE__ uint32_t
Definition: stdint.h:60
__UINT8_TYPE__ uint8_t
Definition: stdint.h:58
Logger backend API.
Definition: log_backend.h:32
void(* panic)(const struct log_backend *const backend)
Definition: log_backend.h:49
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:40
void(* dropped)(const struct log_backend *const backend, uint32_t cnt)
Definition: log_backend.h:48
void(* process)(const struct log_backend *const backend, union log_msg2_generic *msg)
Definition: log_backend.h:34
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:43
void(* init)(const struct log_backend *const backend)
Definition: log_backend.h:50
void(* put)(const struct log_backend *const backend, struct log_msg *msg)
Definition: log_backend.h:38
Logger backend control block.
Definition: log_backend.h:56
uint8_t id
Definition: log_backend.h:58
bool active
Definition: log_backend.h:59
void * ctx
Definition: log_backend.h:57
Logger backend structure.
Definition: log_backend.h:65
const char * name
Definition: log_backend.h:68
const struct log_backend_api * api
Definition: log_backend.h:66
struct log_backend_control_block * cb
Definition: log_backend.h:67
bool autostart
Definition: log_backend.h:69
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:94
Misc utilities.