From c03987ca4918bf280a549d7443555ea8821f741e Mon Sep 17 00:00:00 2001 From: Guillaume Souchere Date: Tue, 23 Sep 2025 08:38:22 +0200 Subject: [PATCH] feat(esp_ringbuf): Update vRingbufferReset to return an error when items are not sent, complete or returned, make the function return an error instead of checking the state in an assert. --- components/esp_ringbuf/include/freertos/ringbuf.h | 5 +++-- components/esp_ringbuf/ringbuf.c | 12 +++++++++--- .../esp_ringbuf/test_apps/main/test_ringbuf_common.c | 3 +-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/components/esp_ringbuf/include/freertos/ringbuf.h b/components/esp_ringbuf/include/freertos/ringbuf.h index ba9f0696dd..02d252afbf 100644 --- a/components/esp_ringbuf/include/freertos/ringbuf.h +++ b/components/esp_ringbuf/include/freertos/ringbuf.h @@ -391,9 +391,10 @@ void vRingbufferReturnItemFromISR(RingbufHandle_t xRingbuffer, void *pvItem, Bas * * @param[in] xRingbuffer Ring buffer to reset * - * @note Users must ensure that all buffers are returned before calling this function + * @return ESP_ERR_INVALID_STATE if one or more items are not sent, completed or returned + * ESP_OK if the operation was successful */ -void vRingbufferReset(RingbufHandle_t xRingbuffer); +esp_err_t vRingbufferReset(RingbufHandle_t xRingbuffer); /** * @brief Delete a ring buffer diff --git a/components/esp_ringbuf/ringbuf.c b/components/esp_ringbuf/ringbuf.c index 85f4142f1e..7addde73a4 100644 --- a/components/esp_ringbuf/ringbuf.c +++ b/components/esp_ringbuf/ringbuf.c @@ -1252,15 +1252,19 @@ void vRingbufferReturnItemFromISR(RingbufHandle_t xRingbuffer, void *pvItem, Bas portEXIT_CRITICAL_ISR(&pxRingbuffer->mux); } -void vRingbufferReset(RingbufHandle_t xRingbuffer) +esp_err_t vRingbufferReset(RingbufHandle_t xRingbuffer) { Ringbuffer_t *pxRingbuffer = (Ringbuffer_t *)xRingbuffer; configASSERT(pxRingbuffer); portENTER_CRITICAL(&pxRingbuffer->mux); // Check for unreturned buffers - configASSERT(pxRingbuffer->pucAcquire == pxRingbuffer->pucWrite); - configASSERT(pxRingbuffer->pucRead == pxRingbuffer->pucFree); + if ((pxRingbuffer->pucAcquire != pxRingbuffer->pucWrite) || + (pxRingbuffer->pucRead != pxRingbuffer->pucFree)) { + portEXIT_CRITICAL(&pxRingbuffer->mux); + return ESP_ERR_INVALID_STATE; + } + // Reset state pxRingbuffer->pucAcquire = pxRingbuffer->pucHead; pxRingbuffer->pucWrite = pxRingbuffer->pucHead; @@ -1276,6 +1280,8 @@ void vRingbufferReset(RingbufHandle_t xRingbuffer) } } portEXIT_CRITICAL(&pxRingbuffer->mux); + + return ESP_OK; } void vRingbufferDelete(RingbufHandle_t xRingbuffer) diff --git a/components/esp_ringbuf/test_apps/main/test_ringbuf_common.c b/components/esp_ringbuf/test_apps/main/test_ringbuf_common.c index 64418c1d58..c5e81d7a4c 100644 --- a/components/esp_ringbuf/test_apps/main/test_ringbuf_common.c +++ b/components/esp_ringbuf/test_apps/main/test_ringbuf_common.c @@ -1371,8 +1371,7 @@ TEST_CASE("Test ring buffer reset unblocks sender ", "[esp_ringbuf][linux]") TEST_ASSERT_EQUAL(false, post_reset_send); // Reset the ring buffer vRingbufferReset(rb); - // Check task has unblocked and sent - vTaskDelay(1); + TEST_ASSERT_EQUAL(true, post_reset_send); // Cleanup vRingbufferDelete(rb);