shell: log_backend: Fix fifo cleanup
When shell log backend was disabled fifo used only in deferred mode was unconditionally flushed which lead to errors in immediate mode where fifo was not present. On the other hand, in case of LOG2_MODE_DEFERRED fifo (mpsc_pbuf) was initialized in enable stage. In order to clean things up, deferred v1 fifo flushing and deferred v2 mpsc pbuf initialization were moved to fifo_reset function which is called when shell log backend is enabled. Signed-off-by: Krzysztof Chruscinski <krzysztof.chruscinski@nordicsemi.no>
This commit is contained in:
parent
f8ac3a49ec
commit
2a3a790a99
1 changed files with 30 additions and 26 deletions
|
@ -17,6 +17,35 @@ int z_shell_log_backend_output_func(uint8_t *data, size_t length, void *ctx)
|
|||
return length;
|
||||
}
|
||||
|
||||
static struct log_msg *msg_from_fifo(const struct shell_log_backend *backend)
|
||||
{
|
||||
struct shell_log_backend_msg msg;
|
||||
int err;
|
||||
|
||||
err = k_msgq_get(backend->msgq, &msg, K_NO_WAIT);
|
||||
|
||||
return (err == 0) ? msg.msg : NULL;
|
||||
}
|
||||
|
||||
/* Set fifo clean state (in case of deferred mode). */
|
||||
static void fifo_reset(const struct shell_log_backend *backend)
|
||||
{
|
||||
if (IS_ENABLED(CONFIG_LOG2_MODE_DEFERRED)) {
|
||||
mpsc_pbuf_init(backend->mpsc_buffer,
|
||||
backend->mpsc_buffer_config);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Flush pending log messages without processing. */
|
||||
if (IS_ENABLED(CONFIG_LOG_MODE_DEFERRED)) {
|
||||
struct log_msg *msg;
|
||||
|
||||
while ((msg = msg_from_fifo(backend)) != NULL) {
|
||||
log_msg_put(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void z_shell_log_backend_enable(const struct shell_log_backend *backend,
|
||||
void *ctx, uint32_t init_log_level)
|
||||
{
|
||||
|
@ -31,12 +60,8 @@ void z_shell_log_backend_enable(const struct shell_log_backend *backend,
|
|||
err = shell->iface->api->enable(shell->iface, true);
|
||||
}
|
||||
|
||||
if (IS_ENABLED(CONFIG_LOG2_MODE_DEFERRED)) {
|
||||
mpsc_pbuf_init(backend->mpsc_buffer,
|
||||
backend->mpsc_buffer_config);
|
||||
}
|
||||
|
||||
if (err == 0) {
|
||||
fifo_reset(backend);
|
||||
log_backend_enable(backend->backend, ctx, init_log_level);
|
||||
log_output_ctx_set(backend->log_output, ctx);
|
||||
backend->control_block->dropped_cnt = 0;
|
||||
|
@ -44,26 +69,6 @@ void z_shell_log_backend_enable(const struct shell_log_backend *backend,
|
|||
}
|
||||
}
|
||||
|
||||
static struct log_msg *msg_from_fifo(const struct shell_log_backend *backend)
|
||||
{
|
||||
struct shell_log_backend_msg msg;
|
||||
int err;
|
||||
|
||||
err = k_msgq_get(backend->msgq, &msg, K_NO_WAIT);
|
||||
|
||||
return (err == 0) ? msg.msg : NULL;
|
||||
}
|
||||
|
||||
static void fifo_flush(const struct shell_log_backend *backend)
|
||||
{
|
||||
struct log_msg *msg;
|
||||
|
||||
/* Flush log messages. */
|
||||
while ((msg = msg_from_fifo(backend)) != NULL) {
|
||||
log_msg_put(msg);
|
||||
}
|
||||
}
|
||||
|
||||
static void flush_expired_messages(const struct shell *shell)
|
||||
{
|
||||
int err;
|
||||
|
@ -127,7 +132,6 @@ static void msg_to_fifo(const struct shell *shell,
|
|||
|
||||
void z_shell_log_backend_disable(const struct shell_log_backend *backend)
|
||||
{
|
||||
fifo_flush(backend);
|
||||
log_backend_disable(backend->backend);
|
||||
backend->control_block->state = SHELL_LOG_BACKEND_DISABLED;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue