logging: Use STRUCT_SECTION macros for log backend

Clean up logging code to utilize macros for handling sections.

Signed-off-by: Krzysztof Chruscinski <krzysztof.chruscinski@nordicsemi.no>
This commit is contained in:
Krzysztof Chruscinski 2022-08-13 08:31:19 +02:00 committed by Carles Cufí
commit e6bbc6941a
8 changed files with 45 additions and 69 deletions

View file

@ -14,9 +14,4 @@
__log_const_end = .; __log_const_end = .;
} GROUP_ROM_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) } GROUP_ROM_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
SECTION_DATA_PROLOGUE(log_backends_sections,,) ITERABLE_SECTION_ROM(log_backend, 4)
{
__log_backends_start = .;
KEEP(*("._log_backend.*"));
__log_backends_end = .;
} GROUP_ROM_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)

View file

@ -94,9 +94,6 @@ struct log_backend {
bool autostart; bool autostart;
}; };
extern const struct log_backend __log_backends_start[];
extern const struct log_backend __log_backends_end[];
/** /**
* @brief Macro for creating a logger backend instance. * @brief Macro for creating a logger backend instance.
* *
@ -246,7 +243,11 @@ static inline uint8_t log_backend_id_get(const struct log_backend *const backend
*/ */
static inline const struct log_backend *log_backend_get(uint32_t idx) static inline const struct log_backend *log_backend_get(uint32_t idx)
{ {
return &__log_backends_start[idx]; const struct log_backend *backend;
STRUCT_SECTION_GET(log_backend, idx, &backend);
return backend;
} }
/** /**
@ -256,7 +257,11 @@ static inline const struct log_backend *log_backend_get(uint32_t idx)
*/ */
static inline int log_backend_count_get(void) static inline int log_backend_count_get(void)
{ {
return __log_backends_end - __log_backends_start; int cnt;
STRUCT_SECTION_COUNT(log_backend, &cnt);
return cnt;
} }
/** /**

View file

@ -41,11 +41,9 @@ static const char * const severity_lvls_sorted[] = {
*/ */
static const struct log_backend *backend_find(char const *name) static const struct log_backend *backend_find(char const *name)
{ {
const struct log_backend *backend;
size_t slen = strlen(name); size_t slen = strlen(name);
for (int i = 0; i < log_backend_count_get(); i++) { STRUCT_SECTION_FOREACH(log_backend, backend) {
backend = log_backend_get(i);
if (strncmp(name, backend->name, slen) == 0) { if (strncmp(name, backend->name, slen) == 0) {
return backend; return backend;
} }
@ -343,13 +341,7 @@ static int cmd_log_backend_go(const struct shell *shell,
static int cmd_log_backends_list(const struct shell *shell, static int cmd_log_backends_list(const struct shell *shell,
size_t argc, char **argv) size_t argc, char **argv)
{ {
int backend_count; STRUCT_SECTION_FOREACH(log_backend, backend) {
backend_count = log_backend_count_get();
for (int i = 0; i < backend_count; i++) {
const struct log_backend *backend = log_backend_get(i);
shell_fprintf(shell, SHELL_NORMAL, shell_fprintf(shell, SHELL_NORMAL,
"%s\r\n" "%s\r\n"
"\t- Status: %s\r\n" "\t- Status: %s\r\n"
@ -410,9 +402,7 @@ static void backend_name_get(size_t idx, struct shell_static_entry *entry)
entry->subcmd = &sub_log_backend; entry->subcmd = &sub_log_backend;
entry->syntax = NULL; entry->syntax = NULL;
if (idx < log_backend_count_get()) { STRUCT_SECTION_FOREACH(log_backend, backend) {
const struct log_backend *backend = log_backend_get(idx);
entry->syntax = backend->name; entry->syntax = backend->name;
} }
} }

View file

@ -159,11 +159,9 @@ static void z_log_msg_post_finalize(void)
const struct log_backend *log_format_set_all_active_backends(size_t log_type) const struct log_backend *log_format_set_all_active_backends(size_t log_type)
{ {
const struct log_backend *backend;
const struct log_backend *failed_backend = NULL; const struct log_backend *failed_backend = NULL;
for (int i = 0; i < log_backend_count_get(); i++) { STRUCT_SECTION_FOREACH(log_backend, backend) {
backend = log_backend_get(i);
if (log_backend_is_active(backend)) { if (log_backend_is_active(backend)) {
int retCode = log_backend_format_set(backend, log_type); int retCode = log_backend_format_set(backend, log_type);
@ -262,16 +260,15 @@ static uint32_t z_log_init(bool blocking, bool can_sleep)
} }
__ASSERT_NO_MSG(log_backend_count_get() < LOG_FILTERS_NUM_OF_SLOTS); __ASSERT_NO_MSG(log_backend_count_get() < LOG_FILTERS_NUM_OF_SLOTS);
int i;
if (atomic_inc(&initialized) != 0) { if (atomic_inc(&initialized) != 0) {
return 0; return 0;
} }
/* Assign ids to backends. */ int i = 0;
for (i = 0; i < log_backend_count_get(); i++) {
const struct log_backend *backend = log_backend_get(i);
/* Assign ids to backends. */
STRUCT_SECTION_FOREACH(log_backend, backend) {
if (backend->autostart) { if (backend->autostart) {
log_backend_init(backend); log_backend_init(backend);
@ -285,6 +282,8 @@ static uint32_t z_log_init(bool blocking, bool can_sleep)
} else { } else {
mask |= BIT(i); mask |= BIT(i);
} }
i++;
} }
} }
@ -346,8 +345,6 @@ int log_set_timestamp_func(log_timestamp_get_t timestamp_getter, uint32_t freq)
void z_impl_log_panic(void) void z_impl_log_panic(void)
{ {
struct log_backend const *backend;
if (panic_mode) { if (panic_mode) {
return; return;
} }
@ -364,9 +361,7 @@ void z_impl_log_panic(void)
} }
} }
for (int i = 0; i < log_backend_count_get(); i++) { STRUCT_SECTION_FOREACH(log_backend, backend) {
backend = log_backend_get(i);
if (log_backend_is_active(backend)) { if (log_backend_is_active(backend)) {
log_backend_panic(backend); log_backend_panic(backend);
} }
@ -425,10 +420,7 @@ static bool msg_filter_check(struct log_backend const *backend,
static void msg_process(union log_msg_generic *msg) static void msg_process(union log_msg_generic *msg)
{ {
struct log_backend const *backend; STRUCT_SECTION_FOREACH(log_backend, backend) {
for (int i = 0; i < log_backend_count_get(); i++) {
backend = log_backend_get(i);
if (log_backend_is_active(backend) && if (log_backend_is_active(backend) &&
msg_filter_check(backend, msg)) { msg_filter_check(backend, msg)) {
log_backend_msg_process(backend, msg); log_backend_msg_process(backend, msg);
@ -440,9 +432,7 @@ void dropped_notify(void)
{ {
uint32_t dropped = z_log_dropped_read_and_clear(); uint32_t dropped = z_log_dropped_read_and_clear();
for (int i = 0; i < log_backend_count_get(); i++) { STRUCT_SECTION_FOREACH(log_backend, backend) {
struct log_backend const *backend = log_backend_get(i);
if (log_backend_is_active(backend)) { if (log_backend_is_active(backend)) {
log_backend_dropped(backend, dropped); log_backend_dropped(backend, dropped);
} }
@ -638,9 +628,7 @@ int log_mem_get_max_usage(uint32_t *max)
static void log_backend_notify_all(enum log_backend_evt event, static void log_backend_notify_all(enum log_backend_evt event,
union log_backend_evt_arg *arg) union log_backend_evt_arg *arg)
{ {
for (int i = 0; i < log_backend_count_get(); i++) { STRUCT_SECTION_FOREACH(log_backend, backend) {
const struct log_backend *backend = log_backend_get(i);
log_backend_notify(backend, event, arg); log_backend_notify(backend, event, arg);
} }
} }

View file

@ -104,12 +104,10 @@ uint32_t z_impl_log_filter_set(struct log_backend const *const backend,
uint32_t *filters = z_log_dynamic_filters_get(source_id); uint32_t *filters = z_log_dynamic_filters_get(source_id);
if (backend == NULL) { if (backend == NULL) {
struct log_backend const *iter_backend;
uint32_t max = 0U; uint32_t max = 0U;
uint32_t current; uint32_t current;
for (int i = 0; i < log_backend_count_get(); i++) { STRUCT_SECTION_FOREACH(log_backend, iter_backend) {
iter_backend = log_backend_get(i);
current = log_filter_set(iter_backend, current = log_filter_set(iter_backend,
domain_id, domain_id,
source_id, level); source_id, level);
@ -174,14 +172,12 @@ static void backend_filter_set(struct log_backend const *const backend,
const struct log_backend *log_backend_get_by_name(const char *backend_name) const struct log_backend *log_backend_get_by_name(const char *backend_name)
{ {
const struct log_backend *ptr = __log_backends_start; STRUCT_SECTION_FOREACH(log_backend, backend) {
if (strcmp(backend_name, backend->name) == 0) {
while (ptr < __log_backends_end) { return backend;
if (strcmp(backend_name, ptr->name) == 0) {
return ptr;
} }
ptr++;
} }
return NULL; return NULL;
} }

View file

@ -127,7 +127,10 @@ static void process_and_validate(bool backend2_enable, bool panic)
mock_log_frontend_validate(panic); mock_log_frontend_validate(panic);
if (NO_BACKENDS) { if (NO_BACKENDS) {
zassert_equal(log_backend_count_get(), 0); int cnt;
STRUCT_SECTION_COUNT(log_backend, &cnt);
zassert_equal(cnt, 0);
return; return;
} }

View file

@ -8,6 +8,7 @@
#include <zephyr/tc_util.h> #include <zephyr/tc_util.h>
#include <stdbool.h> #include <stdbool.h>
#include <zephyr/kernel.h> #include <zephyr/kernel.h>
#include <zephyr/toolchain.h>
#include <zephyr/ztest.h> #include <zephyr/ztest.h>
#include <zephyr/logging/log_backend.h> #include <zephyr/logging/log_backend.h>
#include <zephyr/logging/log_ctrl.h> #include <zephyr/logging/log_ctrl.h>
@ -111,7 +112,10 @@ LOG_BACKEND_DEFINE(backend2, backend_api, true, &context2);
*/ */
ZTEST(log_backend_init, test_log_backends_initialization) ZTEST(log_backend_init, test_log_backends_initialization)
{ {
if (log_backend_count_get() != 2) { int cnt;
STRUCT_SECTION_COUNT(log_backend, &cnt);
if (cnt != 2) {
/* Other backends should not be enabled. */ /* Other backends should not be enabled. */
ztest_test_skip(); ztest_test_skip();
} }

View file

@ -238,10 +238,7 @@ ZTEST(test_log_core_additional, test_log_early_logging)
log_init(); log_init();
/* deactivate other backends */ /* deactivate other backends */
const struct log_backend *backend; STRUCT_SECTION_FOREACH(log_backend, backend) {
for (int i = 0; i < log_backend_count_get(); i++) {
backend = log_backend_get(i);
if (strcmp(backend->name, "test")) { if (strcmp(backend->name, "test")) {
log_backend_deactivate(backend); log_backend_deactivate(backend);
} }
@ -309,10 +306,7 @@ ZTEST(test_log_core_additional, test_log_timestamping)
log_init(); log_init();
/* deactivate all other backend */ /* deactivate all other backend */
const struct log_backend *backend; STRUCT_SECTION_FOREACH(log_backend, backend) {
for (int i = 0; i < log_backend_count_get(); i++) {
backend = log_backend_get(i);
log_backend_deactivate(backend); log_backend_deactivate(backend);
} }
@ -356,18 +350,19 @@ ZTEST(test_log_core_additional, test_log_timestamping)
#define UART_BACKEND "log_backend_uart" #define UART_BACKEND "log_backend_uart"
ZTEST(test_log_core_additional, test_multiple_backends) ZTEST(test_log_core_additional, test_multiple_backends)
{ {
int cnt;
TC_PRINT("Test multiple backends"); TC_PRINT("Test multiple backends");
/* enable both backend1 and backend2 */ /* enable both backend1 and backend2 */
log_setup(true); log_setup(true);
zassert_true((log_backend_count_get() >= 2), STRUCT_SECTION_COUNT(log_backend, &cnt);
zassert_true((cnt >= 2),
"There is no multi backends"); "There is no multi backends");
if (IS_ENABLED(CONFIG_LOG_BACKEND_UART)) { if (IS_ENABLED(CONFIG_LOG_BACKEND_UART)) {
bool have_uart = false; bool have_uart = false;
struct log_backend const *backend;
for (int i = 0; i < log_backend_count_get(); i++) { STRUCT_SECTION_FOREACH(log_backend, backend) {
backend = log_backend_get(i);
if (strcmp(backend->name, UART_BACKEND) == 0) { if (strcmp(backend->name, UART_BACKEND) == 0) {
have_uart = true; have_uart = true;
} }