mirror of https://github.com/xemu-project/xemu.git
util/fifo8: Allow fifo8_pop_buf() to not populate popped length
There might be cases where we know the number of bytes we can pop from the FIFO, or we simply don't care how many bytes is returned. Allow fifo8_pop_buf() to take a NULL numptr. Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com> Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Tested-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20231109192814.95977-2-philmd@linaro.org> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
This commit is contained in:
parent
9468484fe9
commit
cd04033dbe
|
@ -71,7 +71,7 @@ uint8_t fifo8_pop(Fifo8 *fifo);
|
||||||
* fifo8_pop_buf:
|
* fifo8_pop_buf:
|
||||||
* @fifo: FIFO to pop from
|
* @fifo: FIFO to pop from
|
||||||
* @max: maximum number of bytes to pop
|
* @max: maximum number of bytes to pop
|
||||||
* @num: actual number of returned bytes
|
* @numptr: pointer filled with number of bytes returned (can be NULL)
|
||||||
*
|
*
|
||||||
* Pop a number of elements from the FIFO up to a maximum of max. The buffer
|
* Pop a number of elements from the FIFO up to a maximum of max. The buffer
|
||||||
* containing the popped data is returned. This buffer points directly into
|
* containing the popped data is returned. This buffer points directly into
|
||||||
|
@ -82,16 +82,16 @@ uint8_t fifo8_pop(Fifo8 *fifo);
|
||||||
* around in the ring buffer; in this case only a contiguous part of the data
|
* around in the ring buffer; in this case only a contiguous part of the data
|
||||||
* is returned.
|
* is returned.
|
||||||
*
|
*
|
||||||
* The number of valid bytes returned is populated in *num; will always return
|
* The number of valid bytes returned is populated in *numptr; will always
|
||||||
* at least 1 byte. max must not be 0 or greater than the number of bytes in
|
* return at least 1 byte. max must not be 0 or greater than the number of
|
||||||
* the FIFO.
|
* bytes in the FIFO.
|
||||||
*
|
*
|
||||||
* Clients are responsible for checking the availability of requested data
|
* Clients are responsible for checking the availability of requested data
|
||||||
* using fifo8_num_used().
|
* using fifo8_num_used().
|
||||||
*
|
*
|
||||||
* Returns: A pointer to popped data.
|
* Returns: A pointer to popped data.
|
||||||
*/
|
*/
|
||||||
const uint8_t *fifo8_pop_buf(Fifo8 *fifo, uint32_t max, uint32_t *num);
|
const uint8_t *fifo8_pop_buf(Fifo8 *fifo, uint32_t max, uint32_t *numptr);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fifo8_reset:
|
* fifo8_reset:
|
||||||
|
|
12
util/fifo8.c
12
util/fifo8.c
|
@ -66,16 +66,20 @@ uint8_t fifo8_pop(Fifo8 *fifo)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint8_t *fifo8_pop_buf(Fifo8 *fifo, uint32_t max, uint32_t *num)
|
const uint8_t *fifo8_pop_buf(Fifo8 *fifo, uint32_t max, uint32_t *numptr)
|
||||||
{
|
{
|
||||||
uint8_t *ret;
|
uint8_t *ret;
|
||||||
|
uint32_t num;
|
||||||
|
|
||||||
assert(max > 0 && max <= fifo->num);
|
assert(max > 0 && max <= fifo->num);
|
||||||
*num = MIN(fifo->capacity - fifo->head, max);
|
num = MIN(fifo->capacity - fifo->head, max);
|
||||||
ret = &fifo->data[fifo->head];
|
ret = &fifo->data[fifo->head];
|
||||||
fifo->head += *num;
|
fifo->head += num;
|
||||||
fifo->head %= fifo->capacity;
|
fifo->head %= fifo->capacity;
|
||||||
fifo->num -= *num;
|
fifo->num -= num;
|
||||||
|
if (numptr) {
|
||||||
|
*numptr = num;
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue