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"); } }