Message ID | 20230522153144.30610-3-philmd@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | hw/char/pl011: Implement TX (async) FIFO to avoid blocking the main loop | expand |
On [2023 May 22] Mon 17:31:34, Philippe Mathieu-Daudé wrote: > 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> > --- > include/qemu/fifo8.h | 10 +++++----- > util/fifo8.c | 12 ++++++++---- > 2 files changed, 13 insertions(+), 9 deletions(-) > > diff --git a/include/qemu/fifo8.h b/include/qemu/fifo8.h > index 16be02f361..d0d02bc73d 100644 > --- a/include/qemu/fifo8.h > +++ b/include/qemu/fifo8.h > @@ -71,7 +71,7 @@ uint8_t fifo8_pop(Fifo8 *fifo); > * fifo8_pop_buf: > * @fifo: FIFO to pop from > * @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 > * 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 > * is returned. > * > - * The number of valid bytes returned is populated in *num; will always return > - * at least 1 byte. max must not be 0 or greater than the number of bytes in > - * the FIFO. > + * The number of valid bytes returned is populated in *numptr; will always > + * return at least 1 byte. max must not be 0 or greater than the number of > + * bytes in the FIFO. > * > * Clients are responsible for checking the availability of requested data > * using fifo8_num_used(). > * > * 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: > diff --git a/util/fifo8.c b/util/fifo8.c > index d4d1c135e0..032e985440 100644 > --- a/util/fifo8.c > +++ b/util/fifo8.c > @@ -66,16 +66,20 @@ uint8_t fifo8_pop(Fifo8 *fifo) > 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; > + uint32_t 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]; > - fifo->head += *num; > + fifo->head += num; > fifo->head %= fifo->capacity; > - fifo->num -= *num; > + fifo->num -= num; > + if (numptr) { > + *numptr = num; > + } > return ret; > } > > -- > 2.38.1 > >
Philippe Mathieu-Daudé <philmd@linaro.org> writes: > 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: Alex Bennée <alex.bennee@linaro.org>
diff --git a/include/qemu/fifo8.h b/include/qemu/fifo8.h index 16be02f361..d0d02bc73d 100644 --- a/include/qemu/fifo8.h +++ b/include/qemu/fifo8.h @@ -71,7 +71,7 @@ uint8_t fifo8_pop(Fifo8 *fifo); * fifo8_pop_buf: * @fifo: FIFO to pop from * @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 * 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 * is returned. * - * The number of valid bytes returned is populated in *num; will always return - * at least 1 byte. max must not be 0 or greater than the number of bytes in - * the FIFO. + * The number of valid bytes returned is populated in *numptr; will always + * return at least 1 byte. max must not be 0 or greater than the number of + * bytes in the FIFO. * * Clients are responsible for checking the availability of requested data * using fifo8_num_used(). * * 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: diff --git a/util/fifo8.c b/util/fifo8.c index d4d1c135e0..032e985440 100644 --- a/util/fifo8.c +++ b/util/fifo8.c @@ -66,16 +66,20 @@ uint8_t fifo8_pop(Fifo8 *fifo) 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; + uint32_t 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]; - fifo->head += *num; + fifo->head += num; fifo->head %= fifo->capacity; - fifo->num -= *num; + fifo->num -= num; + if (numptr) { + *numptr = num; + } return ret; }
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> --- include/qemu/fifo8.h | 10 +++++----- util/fifo8.c | 12 ++++++++---- 2 files changed, 13 insertions(+), 9 deletions(-)