Shorten u_queue names
[mesa.git] / src / gallium / auxiliary / util / u_ringbuffer.c
index 3f43a19e018988f4187154c5074ade6aa9f71984..f6bb910671ef2e6e2f966f627df617ec97cfda86 100644 (file)
@@ -1,5 +1,5 @@
 
-#include "pipe/p_thread.h"
+#include "os/os_thread.h"
 #include "pipe/p_defines.h"
 #include "util/u_ringbuffer.h"
 #include "util/u_math.h"
@@ -16,18 +16,18 @@ struct util_ringbuffer
     */
    unsigned head;
    unsigned tail;
-   pipe_condvar change;
-   pipe_mutex mutex;
+   cnd_t change;
+   mtx_t mutex;
 };
 
 
 struct util_ringbuffer *util_ringbuffer_create( unsigned dwords )
 {
    struct util_ringbuffer *ring = CALLOC_STRUCT(util_ringbuffer);
-   if (ring == NULL)
+   if (!ring)
       return NULL;
 
-   assert(util_is_power_of_two(dwords));
+   assert(util_is_power_of_two_or_zero(dwords));
    
    ring->buf = MALLOC( dwords * sizeof(unsigned) );
    if (ring->buf == NULL)
@@ -35,8 +35,8 @@ struct util_ringbuffer *util_ringbuffer_create( unsigned dwords )
 
    ring->mask = dwords - 1;
 
-   pipe_condvar_init(ring->change);
-   pipe_mutex_init(ring->mutex);
+   cnd_init(&ring->change);
+   (void) mtx_init(&ring->mutex, mtx_plain);
    return ring;
 
 fail:
@@ -47,17 +47,28 @@ fail:
 
 void util_ringbuffer_destroy( struct util_ringbuffer *ring )
 {
-   pipe_condvar_destroy(ring->change);
-   pipe_mutex_destroy(ring->mutex);
+   cnd_destroy(&ring->change);
+   mtx_destroy(&ring->mutex);
    FREE(ring->buf);
    FREE(ring);
 }
 
-static INLINE unsigned util_ringbuffer_space( const struct util_ringbuffer *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 )
 {
@@ -65,12 +76,16 @@ void util_ringbuffer_enqueue( struct util_ringbuffer *ring,
 
    /* XXX: over-reliance on mutexes, etc:
     */
-   pipe_mutex_lock(ring->mutex);
+   mtx_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)
-      pipe_condvar_wait(ring->change, ring->mutex);
+      cnd_wait(&ring->change, &ring->mutex);
 
    /* Copy data to ring:
     */
@@ -87,8 +102,8 @@ void util_ringbuffer_enqueue( struct util_ringbuffer *ring,
 
    /* Signal change:
     */
-   pipe_condvar_signal(ring->change);
-   pipe_mutex_unlock(ring->mutex);
+   cnd_signal(&ring->change);
+   mtx_unlock(&ring->mutex);
 }
 
 enum pipe_error util_ringbuffer_dequeue( struct util_ringbuffer *ring,
@@ -102,16 +117,16 @@ enum pipe_error util_ringbuffer_dequeue( struct util_ringbuffer *ring,
 
    /* XXX: over-reliance on mutexes, etc:
     */
-   pipe_mutex_lock(ring->mutex);
+   mtx_lock(&ring->mutex);
 
-   /* Wait for free space:
+   /* Get next ring entry:
     */
    if (wait) {
-      while (util_ringbuffer_space(ring) == 0)
-         pipe_condvar_wait(ring->change, ring->mutex);
+      while (util_ringbuffer_empty(ring))
+         cnd_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;
       }
@@ -139,7 +154,7 @@ enum pipe_error util_ringbuffer_dequeue( struct util_ringbuffer *ring,
 out:
    /* Signal change:
     */
-   pipe_condvar_signal(ring->change);
-   pipe_mutex_unlock(ring->mutex);
+   cnd_signal(&ring->change);
+   mtx_unlock(&ring->mutex);
    return ret;
 }