Zephyr Project API  3.2.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
10#include <stdarg.h>
11#include <zephyr/sys/__assert.h>
12#include <zephyr/sys/util.h>
14
15#ifdef __cplusplus
16extern "C" {
17#endif
18
26/* Forward declaration of the log_backend type. */
27struct log_backend;
28
29
46
49};
50
56 void *raw;
57};
58
63 void (*process)(const struct log_backend *const backend,
64 union log_msg_generic *msg);
65
66 void (*dropped)(const struct log_backend *const backend, uint32_t cnt);
67 void (*panic)(const struct log_backend *const backend);
68 void (*init)(const struct log_backend *const backend);
69 int (*is_ready)(const struct log_backend *const backend);
70 int (*format_set)(const struct log_backend *const backend,
71 uint32_t log_type);
72
73 void (*notify)(const struct log_backend *const backend,
74 enum log_backend_evt event,
75 union log_backend_evt_arg *arg);
76};
77
82 void *ctx;
84 bool active;
85};
86
91 const struct log_backend_api *api;
93 const char *name;
95};
96
97extern const struct log_backend __log_backends_start[];
98extern const struct log_backend __log_backends_end[];
99
109#define LOG_BACKEND_DEFINE(_name, _api, _autostart, ...) \
110 static struct log_backend_control_block UTIL_CAT(backend_cb_, _name) = \
111 { \
112 COND_CODE_0(NUM_VA_ARGS_LESS_1(_, ##__VA_ARGS__), \
113 (), (.ctx = __VA_ARGS__,)) \
114 .id = 0, \
115 .active = false, \
116 }; \
117 static const STRUCT_SECTION_ITERABLE(log_backend, _name) = \
118 { \
119 .api = &_api, \
120 .cb = &UTIL_CAT(backend_cb_, _name), \
121 .name = STRINGIFY(_name), \
122 .autostart = _autostart \
123 }
124
125
136static inline void log_backend_init(const struct log_backend *const backend)
137{
138 __ASSERT_NO_MSG(backend != NULL);
139 if (backend->api->init) {
140 backend->api->init(backend);
141 }
142}
143
155static inline int log_backend_is_ready(const struct log_backend *const backend)
156{
157 __ASSERT_NO_MSG(backend != NULL);
158 if (backend->api->is_ready != NULL) {
159 return backend->api->is_ready(backend);
160 }
161
162 return 0;
163}
164
174static inline void log_backend_msg_process(const struct log_backend *const backend,
175 union log_msg_generic *msg)
176{
177 __ASSERT_NO_MSG(backend != NULL);
178 __ASSERT_NO_MSG(msg != NULL);
179 backend->api->process(backend, msg);
180}
181
190static inline void log_backend_dropped(const struct log_backend *const backend,
191 uint32_t cnt)
192{
193 __ASSERT_NO_MSG(backend != NULL);
194
195 if (backend->api->dropped != NULL) {
196 backend->api->dropped(backend, cnt);
197 }
198}
199
205static inline void log_backend_panic(const struct log_backend *const backend)
206{
207 __ASSERT_NO_MSG(backend != NULL);
208 backend->api->panic(backend);
209}
210
219static inline void log_backend_id_set(const struct log_backend *const backend,
220 uint8_t id)
221{
222 __ASSERT_NO_MSG(backend != NULL);
223 backend->cb->id = id;
224}
225
234static inline uint8_t log_backend_id_get(const struct log_backend *const backend)
235{
236 __ASSERT_NO_MSG(backend != NULL);
237 return backend->cb->id;
238}
239
247static inline const struct log_backend *log_backend_get(uint32_t idx)
248{
249 return &__log_backends_start[idx];
250}
251
257static inline int log_backend_count_get(void)
258{
259 return __log_backends_end - __log_backends_start;
260}
261
268static inline void log_backend_activate(const struct log_backend *const backend,
269 void *ctx)
270{
271 __ASSERT_NO_MSG(backend != NULL);
272 backend->cb->ctx = ctx;
273 backend->cb->active = true;
274}
275
281static inline void log_backend_deactivate(
282 const struct log_backend *const backend)
283{
284 __ASSERT_NO_MSG(backend != NULL);
285 backend->cb->active = false;
286}
287
295static inline bool log_backend_is_active(
296 const struct log_backend *const backend)
297{
298 __ASSERT_NO_MSG(backend != NULL);
299 return backend->cb->active;
300}
301
311static inline int log_backend_format_set(const struct log_backend *backend, uint32_t log_type)
312{
313 extern size_t log_format_table_size(void);
314
315 if ((size_t)log_type >= log_format_table_size()) {
316 return -EINVAL;
317 }
318
319 if (log_format_func_t_get(log_type) == NULL) {
320 return -EINVAL;
321 }
322
323 if (backend == NULL) {
324 return -EINVAL;
325 }
326
327 if (backend->api->format_set == NULL) {
328 return -ENOTSUP;
329 }
330
331 return backend->api->format_set(backend, log_type);
332}
333
341static inline void log_backend_notify(const struct log_backend *const backend,
342 enum log_backend_evt event,
343 union log_backend_evt_arg *arg)
344{
345 __ASSERT_NO_MSG(backend != NULL);
346
347 if (backend->api->notify) {
348 backend->api->notify(backend, event, arg);
349 }
350}
351
356#ifdef __cplusplus
357}
358#endif
359
360#endif /* ZEPHYR_INCLUDE_LOGGING_LOG_BACKEND_H_ */
static void log_backend_init(const struct log_backend *const backend)
Initialize or initiate the logging backend.
Definition: log_backend.h:136
log_backend_evt
Backend events.
Definition: log_backend.h:33
static void log_backend_deactivate(const struct log_backend *const backend)
Deactivate backend.
Definition: log_backend.h:281
static void log_backend_msg_process(const struct log_backend *const backend, union log_msg_generic *msg)
Process message.
Definition: log_backend.h:174
static void log_backend_activate(const struct log_backend *const backend, void *ctx)
Activate backend.
Definition: log_backend.h:268
static bool log_backend_is_active(const struct log_backend *const backend)
Check state of the backend.
Definition: log_backend.h:295
static void log_backend_id_set(const struct log_backend *const backend, uint8_t id)
Set backend id.
Definition: log_backend.h:219
static void log_backend_dropped(const struct log_backend *const backend, uint32_t cnt)
Notify backend about dropped log messages.
Definition: log_backend.h:190
static int log_backend_format_set(const struct log_backend *backend, uint32_t log_type)
Set logging format.
Definition: log_backend.h:311
static int log_backend_count_get(void)
Get number of backends.
Definition: log_backend.h:257
static void log_backend_panic(const struct log_backend *const backend)
Reconfigure backend to panic mode.
Definition: log_backend.h:205
static uint8_t log_backend_id_get(const struct log_backend *const backend)
Get backend id.
Definition: log_backend.h:234
static void log_backend_notify(const struct log_backend *const backend, enum log_backend_evt event, union log_backend_evt_arg *arg)
Notify a backend of an event.
Definition: log_backend.h:341
static const struct log_backend * log_backend_get(uint32_t idx)
Get backend.
Definition: log_backend.h:247
static int log_backend_is_ready(const struct log_backend *const backend)
Poll for backend readiness.
Definition: log_backend.h:155
@ LOG_BACKEND_EVT_PROCESS_THREAD_DONE
Event when process thread finishes processing.
Definition: log_backend.h:45
@ LOG_BACKEND_EVT_MAX
Maximum number of backend events.
Definition: log_backend.h:48
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:62
void(* panic)(const struct log_backend *const backend)
Definition: log_backend.h:67
void(* process)(const struct log_backend *const backend, union log_msg_generic *msg)
Definition: log_backend.h:63
void(* notify)(const struct log_backend *const backend, enum log_backend_evt event, union log_backend_evt_arg *arg)
Definition: log_backend.h:73
void(* dropped)(const struct log_backend *const backend, uint32_t cnt)
Definition: log_backend.h:66
int(* is_ready)(const struct log_backend *const backend)
Definition: log_backend.h:69
void(* init)(const struct log_backend *const backend)
Definition: log_backend.h:68
int(* format_set)(const struct log_backend *const backend, uint32_t log_type)
Definition: log_backend.h:70
Logger backend control block.
Definition: log_backend.h:81
uint8_t id
Definition: log_backend.h:83
bool active
Definition: log_backend.h:84
void * ctx
Definition: log_backend.h:82
Logger backend structure.
Definition: log_backend.h:90
const char * name
Definition: log_backend.h:93
const struct log_backend_api * api
Definition: log_backend.h:91
struct log_backend_control_block * cb
Definition: log_backend.h:92
bool autostart
Definition: log_backend.h:94
static void msg(uint64_t c64)
Definition: main.c:17
Argument(s) for backend events.
Definition: log_backend.h:54
void * raw
Unspecified argument(s).
Definition: log_backend.h:56
Definition: log_msg.h:101
Misc utilities.