Commit 157bcc00 authored by Felix Paul Kühne's avatar Felix Paul Kühne

TPCircularBuffer: merge with upstream

parent 81542864
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include <libkern/OSAtomic.h> #include <libkern/OSAtomic.h>
#include <string.h> #include <string.h>
#include <assert.h>
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
...@@ -95,14 +96,16 @@ static __inline__ __attribute__((always_inline)) void* TPCircularBufferTail(TPCi ...@@ -95,14 +96,16 @@ static __inline__ __attribute__((always_inline)) void* TPCircularBufferTail(TPCi
static __inline__ __attribute__((always_inline)) void TPCircularBufferConsume(TPCircularBuffer *buffer, int32_t amount) { static __inline__ __attribute__((always_inline)) void TPCircularBufferConsume(TPCircularBuffer *buffer, int32_t amount) {
buffer->tail = (buffer->tail + amount) % buffer->length; buffer->tail = (buffer->tail + amount) % buffer->length;
OSAtomicAdd32Barrier(-amount, &buffer->fillCount); OSAtomicAdd32Barrier(-amount, &buffer->fillCount);
assert(buffer->fillCount >= 0);
} }
/*! /*!
* Version of TPCircularBufferConsume without the memory barrier, for more optimal use in single-threaded contexts * Version of TPCircularBufferConsume without the memory barrier, for more optimal use in single-threaded contexts
*/ */
static __inline__ __attribute__((always_inline)) void TPCircularBufferConsumeNoBarrier(TPCircularBuffer *buffer, int32_t amount) { static __inline__ __attribute__((always_inline)) void TPCircularBufferConsumeNoBarrier(TPCircularBuffer *buffer, int32_t amount) {
buffer->tail = (buffer->tail + amount) % buffer->length; buffer->tail = (buffer->tail + amount) % buffer->length;
buffer->fillCount -= amount; buffer->fillCount -= amount;
assert(buffer->fillCount >= 0);
} }
/*! /*!
...@@ -134,6 +137,7 @@ static __inline__ __attribute__((always_inline)) void* TPCircularBufferHead(TPCi ...@@ -134,6 +137,7 @@ static __inline__ __attribute__((always_inline)) void* TPCircularBufferHead(TPCi
static __inline__ __attribute__((always_inline)) void TPCircularBufferProduce(TPCircularBuffer *buffer, int amount) { static __inline__ __attribute__((always_inline)) void TPCircularBufferProduce(TPCircularBuffer *buffer, int amount) {
buffer->head = (buffer->head + amount) % buffer->length; buffer->head = (buffer->head + amount) % buffer->length;
OSAtomicAdd32Barrier(amount, &buffer->fillCount); OSAtomicAdd32Barrier(amount, &buffer->fillCount);
assert(buffer->fillCount <= buffer->length);
} }
/*! /*!
...@@ -142,6 +146,7 @@ static __inline__ __attribute__((always_inline)) void TPCircularBufferProduce(TP ...@@ -142,6 +146,7 @@ static __inline__ __attribute__((always_inline)) void TPCircularBufferProduce(TP
static __inline__ __attribute__((always_inline)) void TPCircularBufferProduceNoBarrier(TPCircularBuffer *buffer, int amount) { static __inline__ __attribute__((always_inline)) void TPCircularBufferProduceNoBarrier(TPCircularBuffer *buffer, int amount) {
buffer->head = (buffer->head + amount) % buffer->length; buffer->head = (buffer->head + amount) % buffer->length;
buffer->fillCount += amount; buffer->fillCount += amount;
assert(buffer->fillCount <= buffer->length);
} }
/*! /*!
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment