mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 22:18:13 +02:00
util: fix broken util_ringbuffer_dequeue()
The tests for an empty ring buffer were incorrect. Fixes glxinfo segfaults. Plus, add a new assertion.
This commit is contained in:
parent
62623c4dc5
commit
89bb07730b
1 changed files with 18 additions and 3 deletions
|
|
@ -53,11 +53,22 @@ void util_ringbuffer_destroy( struct util_ringbuffer *ring )
|
|||
FREE(ring);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return number of free entries in the ring
|
||||
*/
|
||||
static INLINE unsigned util_ringbuffer_space( const struct util_ringbuffer *ring )
|
||||
{
|
||||
return (ring->tail - (ring->head + 1)) & ring->mask;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is the ring buffer empty?
|
||||
*/
|
||||
static INLINE boolean util_ringbuffer_empty( const struct util_ringbuffer *ring )
|
||||
{
|
||||
return util_ringbuffer_space(ring) == ring->mask;
|
||||
}
|
||||
|
||||
void util_ringbuffer_enqueue( struct util_ringbuffer *ring,
|
||||
const struct util_packet *packet )
|
||||
{
|
||||
|
|
@ -67,6 +78,10 @@ void util_ringbuffer_enqueue( struct util_ringbuffer *ring,
|
|||
*/
|
||||
pipe_mutex_lock(ring->mutex);
|
||||
|
||||
/* make sure we don't request an impossible amount of space
|
||||
*/
|
||||
assert(packet->dwords <= ring->mask);
|
||||
|
||||
/* Wait for free space:
|
||||
*/
|
||||
while (util_ringbuffer_space(ring) < packet->dwords)
|
||||
|
|
@ -104,14 +119,14 @@ enum pipe_error util_ringbuffer_dequeue( struct util_ringbuffer *ring,
|
|||
*/
|
||||
pipe_mutex_lock(ring->mutex);
|
||||
|
||||
/* Wait for free space:
|
||||
/* Get next ring entry:
|
||||
*/
|
||||
if (wait) {
|
||||
while (util_ringbuffer_space(ring) == 0)
|
||||
while (util_ringbuffer_empty(ring))
|
||||
pipe_condvar_wait(ring->change, ring->mutex);
|
||||
}
|
||||
else {
|
||||
if (util_ringbuffer_space(ring) == 0) {
|
||||
if (util_ringbuffer_empty(ring)) {
|
||||
ret = PIPE_ERROR_OUT_OF_MEMORY;
|
||||
goto out;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue