-#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"
*/
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)
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:
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 )
{
/* 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:
*/
/* 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,
/* 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;
}
out:
/* Signal change:
*/
- pipe_condvar_signal(ring->change);
- pipe_mutex_unlock(ring->mutex);
+ cnd_signal(&ring->change);
+ mtx_unlock(&ring->mutex);
return ret;
}