Mesa (lp-binning): util: fix broken util_ringbuffer_dequeue()

Brian Paul brianp at kemper.freedesktop.org
Mon Jan 18 13:37:26 PST 2010


Module: Mesa
Branch: lp-binning
Commit: 89bb07730b1c0f292d1d70a99466e8a885fb87bf
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=89bb07730b1c0f292d1d70a99466e8a885fb87bf

Author: Brian Paul <brianp at vmware.com>
Date:   Mon Jan 18 14:35:43 2010 -0700

util: fix broken util_ringbuffer_dequeue()

The tests for an empty ring buffer were incorrect.
Fixes glxinfo segfaults.

Plus, add a new assertion.

---

 src/gallium/auxiliary/util/u_ringbuffer.c |   21 ++++++++++++++++++---
 1 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/src/gallium/auxiliary/util/u_ringbuffer.c b/src/gallium/auxiliary/util/u_ringbuffer.c
index 3f43a19..e73ba0b 100644
--- a/src/gallium/auxiliary/util/u_ringbuffer.c
+++ b/src/gallium/auxiliary/util/u_ringbuffer.c
@@ -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;
       }



More information about the mesa-commit mailing list