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.
This commit is contained in:
Guillaume Souchere
2025-09-23 08:38:22 +02:00
parent 589d5b132d
commit c03987ca49
3 changed files with 13 additions and 7 deletions

View File

@@ -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

View File

@@ -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)

View File

@@ -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);