From d3cb88ad61b40afe33958dba3a678bc4b34e5276 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Ga=C5=82at?= Date: Mon, 10 Feb 2025 14:34:15 +0000 Subject: [PATCH] test: check if sid_process is blocking the queue MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit check if calling sid_process in a loop will solve the issue Signed-off-by: Robert Gałat --- samples/sid_end_device/src/sidewalk.c | 33 +++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/samples/sid_end_device/src/sidewalk.c b/samples/sid_end_device/src/sidewalk.c index a94da41d8..bbc840dd6 100644 --- a/samples/sid_end_device/src/sidewalk.c +++ b/samples/sid_end_device/src/sidewalk.c @@ -3,6 +3,8 @@ * * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause */ +#include +#include #include #include @@ -17,6 +19,8 @@ K_MSGQ_DEFINE(sidewalk_thread_msgq, sizeof(sidewalk_ctx_event_t), CONFIG_SIDEWAL 4); K_SEM_DEFINE(sid_thread_started, 0, 1); + +K_SEM_DEFINE(sid_process_requested, 0, 1); static void sid_thread_entry(void *context, void *unused, void *unused2) { ARG_UNUSED(unused); @@ -28,21 +32,35 @@ static void sid_thread_entry(void *context, void *unused, void *unused2) k_sem_give(&sid_thread_started); while (1) { - int err = k_msgq_get(&sidewalk_thread_msgq, &event, K_FOREVER); + int err = k_msgq_get(&sidewalk_thread_msgq, &event, K_MSEC(1)); #if CONFIG_SIDEWALK_TRACE_SIDEWALK_QUEUE - LOG_INF("sidewalk workq usage (%d/%d)", k_msgq_num_used_get(&sidewalk_thread_msgq), + LOG_INF("event handler get = %p, sidewalk workq usage (%d/%d) ( after get )", + (void *)(event.handler), k_msgq_num_used_get(&sidewalk_thread_msgq), CONFIG_SIDEWALK_THREAD_QUEUE_SIZE); #endif - if (!err) { + switch (err) { + case 0: { if (event.handler) { event.handler(sid, event.ctx); } if (event.ctx_free) { event.ctx_free(event.ctx); } - } else { + break; + } + case -EAGAIN: + case -ENOMSG: { + // Do nothing, just timeout + break; + } + default: { LOG_ERR("Sidewalk msgq err %d", err); } + } + + if (0 == k_sem_take(&sid_process_requested, K_NO_WAIT)) { + sidewalk_event_process(sid, NULL); + } } LOG_ERR("Sidewalk thread ends. You should never see this message."); @@ -59,6 +77,10 @@ void sidewalk_start(sidewalk_ctx_t *context) int sidewalk_event_send(event_handler_t event, void *ctx, ctx_free free) { + if (event == sidewalk_event_process) { + k_sem_give(&sid_process_requested); + return 0; + } sidewalk_ctx_event_t ctx_event = { .handler = event, .ctx = ctx, @@ -76,7 +98,8 @@ int sidewalk_event_send(event_handler_t event, void *ctx, ctx_free free) #endif /* CONFIG_SIDEWALK_THREAD_QUEUE_TIMEOUT_VALUE > 0 */ result = k_msgq_put(&sidewalk_thread_msgq, (void *)&ctx_event, timeout); #if CONFIG_SIDEWALK_TRACE_SIDEWALK_QUEUE - LOG_INF("sidewalk workq usage (%d/%d)", k_msgq_num_used_get(&sidewalk_thread_msgq), + LOG_INF("event handler send = %p, sidewalk workq usage (%d/%d) (after put)", + (event_handler_t *)event, k_msgq_num_used_get(&sidewalk_thread_msgq), CONFIG_SIDEWALK_THREAD_QUEUE_SIZE); #endif LOG_DBG("sidewalk_event_send event = %p, context = %p, k_msgq_put result %d", (void *)event,