util: fix broken util_ringbuffer_dequeue()
authorBrian Paul <brianp@vmware.com>
Mon, 18 Jan 2010 21:35:43 +0000 (14:35 -0700)
committerBrian Paul <brianp@vmware.com>
Mon, 18 Jan 2010 21:35:43 +0000 (14:35 -0700)
The tests for an empty ring buffer were incorrect.
Fixes glxinfo segfaults.

Plus, add a new assertion.

src/gallium/auxiliary/util/u_ringbuffer.c

index 3f43a19e018988f4187154c5074ade6aa9f71984..e73ba0b3481924afeb2c2681f0294bd84aaa533c 100644 (file)
@@ -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;
       }