From ad377ebfc8ff7f96ee004fb226d0814ed52c0915 Mon Sep 17 00:00:00 2001 From: ismail Date: Thu, 4 Sep 2025 15:46:57 +0300 Subject: [PATCH] Fix the operation of unregistering listener - Add check for empty listener list in find_listener_entry function. - Reset notification queue when all listeners are removed. - Change queue operation to send remove_listener message to the front of the queue. Refs #1085, #1096 and fixes #1102 --- src/relay_chn_notify.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/relay_chn_notify.c b/src/relay_chn_notify.c index 0051d2a..47e3b55 100644 --- a/src/relay_chn_notify.c +++ b/src/relay_chn_notify.c @@ -118,6 +118,11 @@ void relay_chn_notify_deinit(void) */ static relay_chn_listener_entry_t* find_listener_entry(relay_chn_state_listener_t listener) { + if (listLIST_IS_EMPTY(&listeners)) { + ESP_LOGD(TAG, "No listeners registered"); + return NULL; + } + // Iterate through the linked list of listeners for (ListItem_t *pxListItem = listGET_HEAD_ENTRY(&listeners); pxListItem != listGET_END_MARKER(&listeners); @@ -164,6 +169,11 @@ static void do_remove_listener(relay_chn_state_listener_t listener) } else { ESP_LOGD(TAG, "Listener %p not found for unregistration.", listener); } + + if (listLIST_IS_EMPTY(&listeners)) { + // Flush all pending notifications in the queue + xQueueReset(notify_msg_queue); + } } esp_err_t relay_chn_notify_add_listener(relay_chn_state_listener_t listener) @@ -191,7 +201,7 @@ void relay_chn_notify_remove_listener(relay_chn_state_listener_t listener) } relay_chn_notify_msg_t msg = { .cmd = RELAY_CHN_NOTIFY_CMD_REMOVE_LISTENER, .payload.listener = listener }; - if (xQueueSend(notify_msg_queue, &msg, 0) != pdTRUE) { + if (xQueueSendToFront(notify_msg_queue, &msg, 0) != pdTRUE) { ESP_LOGW(TAG, "Notify queue is full, failed to queue remove_listener"); } }