Zephyr API Documentation 4.5.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
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
12
13#ifndef ZEPHYR_INCLUDE_LOGGING_LOG_BACKEND_H_
14#define ZEPHYR_INCLUDE_LOGGING_LOG_BACKEND_H_
15
17#include <stdarg.h>
18#include <zephyr/sys/__assert.h>
19#include <zephyr/sys/util.h>
22
23#ifdef __cplusplus
24extern "C" {
25#endif
26
33
34/* Forward declaration of the log_backend type. */
35struct log_backend;
36
37
69
75 void *raw;
76};
77
87 void (*process)(const struct log_backend *const backend,
88 union log_msg_generic *msg);
89
91 void (*dropped)(const struct log_backend *const backend, uint32_t cnt);
93 void (*panic)(const struct log_backend *const backend);
95 void (*init)(const struct log_backend *const backend);
97 int (*is_ready)(const struct log_backend *const backend);
99 int (*format_set)(const struct log_backend *const backend,
100 uint32_t log_type);
101
103 void (*notify)(const struct log_backend *const backend,
104 enum log_backend_evt event,
105 union log_backend_evt_arg *arg);
106};
107
116 void *ctx;
117 uint8_t id;
118 bool active;
119 bool initialized;
120
121 /* Initialization level. */
122 uint8_t level;
124};
125
130 const struct log_backend_api *api;
132 const char *name;
134};
135
145#define LOG_BACKEND_DEFINE(_name, _api, _autostart, ...) \
146 static struct log_backend_control_block UTIL_CAT(backend_cb_, _name) = \
147 { \
148 COND_CODE_0(NUM_VA_ARGS_LESS_1(_, ##__VA_ARGS__), \
149 (), (.ctx = __VA_ARGS__,)) \
150 .id = 0, \
151 .active = false, \
152 }; \
153 static const STRUCT_SECTION_ITERABLE(log_backend, _name) = \
154 { \
155 .api = &_api, \
156 .cb = &UTIL_CAT(backend_cb_, _name), \
157 .name = STRINGIFY(_name), \
158 .autostart = _autostart \
159 }
160
161
172static inline void log_backend_init(const struct log_backend *const backend)
173{
174 __ASSERT_NO_MSG(backend != NULL);
175 if (backend->api->init) {
176 backend->api->init(backend);
177 }
178 backend->cb->initialized = true;
179}
180
192static inline int log_backend_is_ready(const struct log_backend *const backend)
193{
194 __ASSERT_NO_MSG(backend != NULL);
195 if (backend->api->is_ready != NULL) {
196 return backend->api->is_ready(backend);
197 }
198
199 return 0;
200}
201
211static inline void log_backend_msg_process(const struct log_backend *const backend,
212 union log_msg_generic *msg)
213{
214 __ASSERT_NO_MSG(backend != NULL);
215 __ASSERT_NO_MSG(msg != NULL);
216 backend->api->process(backend, msg);
217}
218
227static inline void log_backend_dropped(const struct log_backend *const backend,
228 uint32_t cnt)
229{
230 __ASSERT_NO_MSG(backend != NULL);
231
232 if (backend->api->dropped != NULL) {
233 backend->api->dropped(backend, cnt);
234 }
235}
236
242static inline void log_backend_panic(const struct log_backend *const backend)
243{
244 __ASSERT_NO_MSG(backend != NULL);
245 backend->api->panic(backend);
246}
247
256static inline void log_backend_id_set(const struct log_backend *const backend,
257 uint8_t id)
258{
259 __ASSERT_NO_MSG(backend != NULL);
260 backend->cb->id = id;
261}
262
271static inline uint8_t log_backend_id_get(const struct log_backend *const backend)
272{
273 __ASSERT_NO_MSG(backend != NULL);
274 return backend->cb->id;
275}
276
284static inline const struct log_backend *log_backend_get(uint32_t idx)
285{
286 const struct log_backend *backend;
287
288 STRUCT_SECTION_GET(log_backend, idx, &backend);
289
290 return backend;
291}
292
298static inline int log_backend_count_get(void)
299{
300 int cnt;
301
303
304 return cnt;
305}
306
313static inline void log_backend_activate(const struct log_backend *const backend,
314 void *ctx)
315{
316 __ASSERT_NO_MSG(backend != NULL);
317 backend->cb->ctx = ctx;
318 backend->cb->active = true;
319}
320
326static inline void log_backend_deactivate(
327 const struct log_backend *const backend)
328{
329 __ASSERT_NO_MSG(backend != NULL);
330 backend->cb->active = false;
331}
332
340static inline bool log_backend_is_active(
341 const struct log_backend *const backend)
342{
343 __ASSERT_NO_MSG(backend != NULL);
344 return backend->cb->active;
345}
346
356static inline int log_backend_format_set(const struct log_backend *backend, uint32_t log_type)
357{
358 extern size_t log_format_table_size(void);
359
360 if ((size_t)log_type >= log_format_table_size()) {
361 return -EINVAL;
362 }
363
364 if (log_format_func_t_get(log_type) == NULL) {
365 return -EINVAL;
366 }
367
368 if (backend == NULL) {
369 return -EINVAL;
370 }
371
372 if (backend->api->format_set == NULL) {
373 return -ENOTSUP;
374 }
375
376 return backend->api->format_set(backend, log_type);
377}
378
386static inline void log_backend_notify(const struct log_backend *const backend,
387 enum log_backend_evt event,
388 union log_backend_evt_arg *arg)
389{
390 __ASSERT_NO_MSG(backend != NULL);
391
392 if (backend->api->notify) {
393 backend->api->notify(backend, event, arg);
394 }
395}
396
400
401#ifdef __cplusplus
402}
403#endif
404
405#endif /* ZEPHYR_INCLUDE_LOGGING_LOG_BACKEND_H_ */
#define STRUCT_SECTION_GET(struct_type, i, dst)
Get element from section.
Definition iterable_sections.h:339
#define STRUCT_SECTION_COUNT(struct_type, dst)
Count elements in a section.
Definition iterable_sections.h:348
static void log_backend_init(const struct log_backend *const backend)
Initialize or initiate the logging backend.
Definition log_backend.h:172
log_backend_evt
Backend events.
Definition log_backend.h:41
static void log_backend_deactivate(const struct log_backend *const backend)
Deactivate backend.
Definition log_backend.h:326
static void log_backend_msg_process(const struct log_backend *const backend, union log_msg_generic *msg)
Process message.
Definition log_backend.h:211
static void log_backend_activate(const struct log_backend *const backend, void *ctx)
Activate backend.
Definition log_backend.h:313
static bool log_backend_is_active(const struct log_backend *const backend)
Check state of the backend.
Definition log_backend.h:340
static void log_backend_id_set(const struct log_backend *const backend, uint8_t id)
Set backend id.
Definition log_backend.h:256
static void log_backend_dropped(const struct log_backend *const backend, uint32_t cnt)
Notify backend about dropped log messages.
Definition log_backend.h:227
static int log_backend_format_set(const struct log_backend *backend, uint32_t log_type)
Set logging format.
Definition log_backend.h:356
static int log_backend_count_get(void)
Get number of backends.
Definition log_backend.h:298
static void log_backend_panic(const struct log_backend *const backend)
Reconfigure backend to panic mode.
Definition log_backend.h:242
static uint8_t log_backend_id_get(const struct log_backend *const backend)
Get backend id.
Definition log_backend.h:271
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:386
static const struct log_backend * log_backend_get(uint32_t idx)
Get backend.
Definition log_backend.h:284
static int log_backend_is_ready(const struct log_backend *const backend)
Poll for backend readiness.
Definition log_backend.h:192
@ LOG_BACKEND_EVT_PROCESS_THREAD_DONE
Event when process thread finishes processing.
Definition log_backend.h:53
@ LOG_BACKEND_EVT_MAX
Maximum number of backend events.
Definition log_backend.h:67
@ LOG_BACKEND_EVT_PROCESS_THREAD_START
Event when process thread starts processing.
Definition log_backend.h:64
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
Invalid argument.
Definition errno.h:61
#define ENOTSUP
Unsupported value.
Definition errno.h:115
Header file for log messages.
Header file for the log output formatter.
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
Logger backend API.
Definition log_backend.h:85
void(* panic)(const struct log_backend *const backend)
Mandatory: switch the backend to panic (blocking) mode.
Definition log_backend.h:93
void(* process)(const struct log_backend *const backend, union log_msg_generic *msg)
Mandatory: process a single log message (see log_backend_msg_process()).
Definition log_backend.h:87
void(* notify)(const struct log_backend *const backend, enum log_backend_evt event, union log_backend_evt_arg *arg)
Optional: handle a backend event (see log_backend_notify()).
Definition log_backend.h:103
void(* dropped)(const struct log_backend *const backend, uint32_t cnt)
Optional: report number of dropped messages (see log_backend_dropped()).
Definition log_backend.h:91
int(* is_ready)(const struct log_backend *const backend)
Optional: poll for backend readiness (see log_backend_is_ready()).
Definition log_backend.h:97
void(* init)(const struct log_backend *const backend)
Optional: initialize the backend (see log_backend_init()).
Definition log_backend.h:95
int(* format_set)(const struct log_backend *const backend, uint32_t log_type)
Optional: set the output format type (see log_backend_format_set()).
Definition log_backend.h:99
Logger backend control block.
Definition log_backend.h:114
Logger backend structure.
Definition log_backend.h:129
const char * name
Unique backend name.
Definition log_backend.h:132
const struct log_backend_api * api
Backend operations.
Definition log_backend.h:130
struct log_backend_control_block * cb
Run-time control block.
Definition log_backend.h:131
bool autostart
Enable the backend automatically at logger startup.
Definition log_backend.h:133
Iterable sections helpers.
Misc utilities.
Argument(s) for backend events.
Definition log_backend.h:73
void * raw
Unspecified argument(s).
Definition log_backend.h:75