Browse Source

【主线待合、重要修改】环形缓冲区现在支持原子操作

master
Lizongdi 3 weeks ago
parent
commit
d126befb64
  1. 26
      library/common/include/common.h
  2. 17
      library/ringbuffer/include/ringbuffer.h
  3. 451
      library/ringbuffer/ringbuffer.c

26
library/common/include/common.h

@ -11,6 +11,32 @@
#define RD_NULL -2 //对象为空 #define RD_NULL -2 //对象为空
#define RD_INVALUE -3 //非法参数 #define RD_INVALUE -3 //非法参数
/* 原子操作跨平台要兼容 */
#if defined(__GNUC__) || defined(__clang__)
#define ATOMIC_LOAD(ptr, type, order) __atomic_load_n((ptr), (order))
#define ATOMIC_STORE(ptr, val, type, order) __atomic_store_n((ptr), (val), (order))
#define ATOMIC_ADD(ptr, val, type, order) __atomic_fetch_add((ptr), (val), (order))
#define ATOMIC_SUB(ptr, val, type, order) __atomic_fetch_sub((ptr), (val), (order))
#define ATOMIC_EXCH(ptr, val, type, order) __atomic_exchange_n((ptr), (val), (order))
#define ATOMIC_CMPXCHG(ptr, expected, desired, order) \
__atomic_compare_exchange_n((ptr), &(expected), (desired), 0, (order), (order))
#define ATOMIC_ORDER_RELAXED __ATOMIC_RELAXED
#define ATOMIC_ORDER_ACQUIRE __ATOMIC_ACQUIRE
#define ATOMIC_ORDER_RELEASE __ATOMIC_RELEASE
#else
/* 退化为普通访问(不安全,仅用于单线程或调试) */
#define ATOMIC_LOAD(ptr, type, order) (*(ptr))
#define ATOMIC_STORE(ptr, val, type, order) (*(ptr) = (val))
#define ATOMIC_ADD(ptr, val, type, order) (*(ptr) += (val))
#define ATOMIC_SUB(ptr, val, type, order) (*(ptr) -= (val))
#define ATOMIC_EXCH(ptr, val, type, order) ((*(ptr) = (val)), (val))
#define ATOMIC_CMPXCHG(ptr, expected, desired, order) \
((*(ptr) == (expected)) ? ((*(ptr) = (desired)), 1) : 0)
#define ATOMIC_ORDER_RELAXED 0
#define ATOMIC_ORDER_ACQUIRE 0
#define ATOMIC_ORDER_RELEASE 0
#endif
/* 跨平台弱符号宏定义 */ /* 跨平台弱符号宏定义 */
#if defined(_MSC_VER) || defined(WIN32) #if defined(_MSC_VER) || defined(WIN32)
/* Microsoft Visual C++ */ /* Microsoft Visual C++ */

17
library/ringbuffer/include/ringbuffer.h

@ -85,8 +85,6 @@ enum ERingBufState
RINGBUFFER_HALFFULL, RINGBUFFER_HALFFULL,
}; };
int rd_RingbufferDataLen(rd_ringbuf_t *rb);
/** /**
* @brief Get the buffer size of the ring buffer object. * @brief Get the buffer size of the ring buffer object.
* *
@ -103,21 +101,6 @@ rd_inline int rd_RingbufferGetSize(rd_ringbuf_t *rb)
return rb->m_iBufsize; return rb->m_iBufsize;
} }
rd_inline enum ERingBufState rd_RingbufferStatus(rd_ringbuf_t *rb)
{
if (rb->m_sReadIndex == rb->m_sWriteIndex)
{
if (rb->m_bReadMirror == rb->m_bWriteMirror)
return RINGBUFFER_EMPTY;
else
return RINGBUFFER_FULL;
}
return RINGBUFFER_HALFFULL;
}
/** return the size of empty space in rb */
#define rd_RingbufferSpaceLen(rb) ((rb)->m_iBufsize - rd_RingbufferDataLen(rb))
/*==============================================* /*==============================================*
* project-wide global variables * * project-wide global variables *
*----------------------------------------------*/ *----------------------------------------------*/

451
library/ringbuffer/ringbuffer.c

@ -61,20 +61,52 @@
*/ */
void rd_RingbufferInit(rd_ringbuf_t *rb, char *pool, int size) void rd_RingbufferInit(rd_ringbuf_t *rb, char *pool, int size)
{ {
if(NULL == rb || NULL == pool || size <= 0) if (!rb || !pool || size <= 0)
{
return; return;
}
/* initialize read and write index */ /* 原子方式初始化索引与镜像位 */
rb->m_bReadMirror = rb->m_sReadIndex = 0; ATOMIC_STORE(&rb->m_sReadIndex, 0, unsigned short, ATOMIC_ORDER_RELAXED);
rb->m_bWriteMirror = rb->m_sWriteIndex = 0; ATOMIC_STORE(&rb->m_sWriteIndex, 0, unsigned short, ATOMIC_ORDER_RELAXED);
ATOMIC_STORE(&rb->m_bReadMirror, 0, unsigned char, ATOMIC_ORDER_RELAXED);
ATOMIC_STORE(&rb->m_bWriteMirror, 0, unsigned char, ATOMIC_ORDER_RELAXED);
/* set buffer pool and size */
rb->m_pcBufPtr = pool; rb->m_pcBufPtr = pool;
rb->m_iBufsize = RD_ALIGN_DOWN(size, RD_ALIGN_SIZE); rb->m_iBufsize = RD_ALIGN_DOWN(size, RD_ALIGN_SIZE);
} }
/* 计算可写空间(原子读取索引) */
int rd_RingbufferSpaceLen(rd_ringbuf_t *rb)
{
if (!rb) return -1;
unsigned short wi = ATOMIC_LOAD(&rb->m_sWriteIndex, unsigned short, ATOMIC_ORDER_ACQUIRE);
unsigned short ri = ATOMIC_LOAD(&rb->m_sReadIndex, unsigned short, ATOMIC_ORDER_RELAXED);
unsigned char wb = ATOMIC_LOAD(&rb->m_bWriteMirror, unsigned char, ATOMIC_ORDER_ACQUIRE);
unsigned char rb_m = ATOMIC_LOAD(&rb->m_bReadMirror, unsigned char, ATOMIC_ORDER_RELAXED);
if (wb == rb_m) {
return rb->m_iBufsize - (wi - ri);
} else {
return ri - wi;
}
}
/* 获取环形缓冲区状态(读/写索引) */
static enum ERingBufState rd_RingbufferStatus(rd_ringbuf_t *rb)
{
if (!rb) return RINGBUFFER_EMPTY;
unsigned short wi = ATOMIC_LOAD(&rb->m_sWriteIndex, unsigned short, ATOMIC_ORDER_ACQUIRE);
unsigned short ri = ATOMIC_LOAD(&rb->m_sReadIndex, unsigned short, ATOMIC_ORDER_RELAXED);
unsigned char wb = ATOMIC_LOAD(&rb->m_bWriteMirror, unsigned char, ATOMIC_ORDER_ACQUIRE);
unsigned char rb_m = ATOMIC_LOAD(&rb->m_bReadMirror, unsigned char, ATOMIC_ORDER_RELAXED);
if (wi == ri) {
return (wb == rb_m) ? RINGBUFFER_EMPTY : RINGBUFFER_FULL;
}
return RINGBUFFER_HALFFULL;
}
/** /**
* @brief Put a block of data into the ring buffer. If the capacity of ring buffer is insufficient, it will discard out-of-range data. * @brief Put a block of data into the ring buffer. If the capacity of ring buffer is insufficient, it will discard out-of-range data.
* *
@ -86,49 +118,29 @@ void rd_RingbufferInit(rd_ringbuf_t *rb, char *pool, int size)
*/ */
int rd_RingbufferPut(rd_ringbuf_t *rb, const char *ptr, int length) int rd_RingbufferPut(rd_ringbuf_t *rb, const char *ptr, int length)
{ {
int size = 0; if (!rb || !ptr || length <= 0) return RD_INVALUE;
if(NULL == rb || NULL == ptr || length <= 0)
{
return RD_INVALUE;
}
/* whether has enough space */ int space = rd_RingbufferSpaceLen(rb);
size = rd_RingbufferSpaceLen(rb); if (space == 0) return 0;
if (space < length) length = space;
/* no space */ unsigned short wi = ATOMIC_LOAD(&rb->m_sWriteIndex, unsigned short, ATOMIC_ORDER_RELAXED);
if (size == 0) unsigned char wb = ATOMIC_LOAD(&rb->m_bWriteMirror, unsigned char, ATOMIC_ORDER_RELAXED);
{
return 0;
}
/* drop some data */
if (size < length)
{
length = size;
}
if (rb->m_iBufsize - rb->m_sWriteIndex > length) /* 写入不跨越尾部 */
{ if (rb->m_iBufsize - wi > length) {
/* m_sReadIndex - m_sWriteIndex = empty space */ RD_MEMCPY(&rb->m_pcBufPtr[wi], ptr, length);
RD_MEMCPY(&rb->m_pcBufPtr[rb->m_sWriteIndex], ptr, length); wi += length;
/* this should not cause overflow because there is enough space for } else {
* length of data in current mirror */ int first = rb->m_iBufsize - wi;
rb->m_sWriteIndex += length; RD_MEMCPY(&rb->m_pcBufPtr[wi], ptr, first);
return length; RD_MEMCPY(&rb->m_pcBufPtr[0], ptr + first, length - first);
wb ^= 1; /* 翻转镜像位 */
wi = length - first;
} }
RD_MEMCPY(&rb->m_pcBufPtr[rb->m_sWriteIndex], ATOMIC_STORE(&rb->m_sWriteIndex, wi, unsigned short, ATOMIC_ORDER_RELEASE);
&ptr[0], ATOMIC_STORE(&rb->m_bWriteMirror, wb, unsigned char, ATOMIC_ORDER_RELEASE);
rb->m_iBufsize - rb->m_sWriteIndex);
RD_MEMCPY(&rb->m_pcBufPtr[0],
&ptr[rb->m_iBufsize - rb->m_sWriteIndex],
length - (rb->m_iBufsize - rb->m_sWriteIndex));
/* we are going into the other side of the mirror */
rb->m_bWriteMirror ^= 1;
rb->m_sWriteIndex = length - (rb->m_iBufsize - rb->m_sWriteIndex);
return length; return length;
} }
@ -143,53 +155,38 @@ int rd_RingbufferPut(rd_ringbuf_t *rb, const char *ptr, int length)
*/ */
int rd_RingbufferPutForce(rd_ringbuf_t *rb, const char *ptr, int length) int rd_RingbufferPutForce(rd_ringbuf_t *rb, const char *ptr, int length)
{ {
int space_length; if (!rb || !ptr || length <= 0) return RD_INVALUE;
if (NULL == rb || NULL == ptr || length <= 0) int space = rd_RingbufferSpaceLen(rb);
{ if (length > rb->m_iBufsize) {
return RD_INVALUE; ptr += length - rb->m_iBufsize;
}
space_length = rd_RingbufferSpaceLen(rb);
if (length > rb->m_iBufsize)
{
ptr = &ptr[length - rb->m_iBufsize];
length = rb->m_iBufsize; length = rb->m_iBufsize;
} }
if (rb->m_iBufsize - rb->m_sWriteIndex > length) unsigned short wi = ATOMIC_LOAD(&rb->m_sWriteIndex, unsigned short, ATOMIC_ORDER_RELAXED);
{ unsigned char wb = ATOMIC_LOAD(&rb->m_bWriteMirror, unsigned char, ATOMIC_ORDER_RELAXED);
/* m_sReadIndex - m_sWriteIndex = empty space */
RD_MEMCPY(&rb->m_pcBufPtr[rb->m_sWriteIndex], ptr, length);
/* this should not cause overflow because there is enough space for
* length of data in current mirror */
rb->m_sWriteIndex += length;
if (length > space_length)
rb->m_sReadIndex = rb->m_sWriteIndex;
return length;
}
RD_MEMCPY(&rb->m_pcBufPtr[rb->m_sWriteIndex], if (rb->m_iBufsize - wi > length) {
&ptr[0], RD_MEMCPY(&rb->m_pcBufPtr[wi], ptr, length);
rb->m_iBufsize - rb->m_sWriteIndex); wi += length;
RD_MEMCPY(&rb->m_pcBufPtr[0], if (length > space) {
&ptr[rb->m_iBufsize - rb->m_sWriteIndex], ATOMIC_STORE(&rb->m_sReadIndex, wi, unsigned short, ATOMIC_ORDER_RELEASE);
length - (rb->m_iBufsize - rb->m_sWriteIndex)); }
} else {
/* we are going into the other side of the mirror */ int first = rb->m_iBufsize - wi;
rb->m_bWriteMirror ^= 1; RD_MEMCPY(&rb->m_pcBufPtr[wi], ptr, first);
rb->m_sWriteIndex = length - (rb->m_iBufsize - rb->m_sWriteIndex); RD_MEMCPY(&rb->m_pcBufPtr[0], ptr + first, length - first);
wb ^= 1;
if (length > space_length) wi = length - first;
{ if (length > space) {
if (rb->m_sWriteIndex <= rb->m_sReadIndex) unsigned short ri = ATOMIC_LOAD(&rb->m_sReadIndex, unsigned short, ATOMIC_ORDER_RELAXED);
rb->m_bReadMirror ^= 1; if (wi <= ri) wb ^= 1;
rb->m_sReadIndex = rb->m_sWriteIndex; ATOMIC_STORE(&rb->m_sReadIndex, wi, unsigned short, ATOMIC_ORDER_RELEASE);
}
} }
ATOMIC_STORE(&rb->m_sWriteIndex, wi, unsigned short, ATOMIC_ORDER_RELEASE);
ATOMIC_STORE(&rb->m_bWriteMirror, wb, unsigned char, ATOMIC_ORDER_RELEASE);
return length; return length;
} }
@ -204,49 +201,28 @@ int rd_RingbufferPutForce(rd_ringbuf_t *rb, const char *ptr, int length)
*/ */
int rd_RingbufferGet(rd_ringbuf_t *rb, char *ptr, int length) int rd_RingbufferGet(rd_ringbuf_t *rb, char *ptr, int length)
{ {
int size; if (!rb || !ptr || length <= 0) return RD_INVALUE;
if (NULL == rb || NULL == ptr || length <= 0) int avail = rd_RingbufferDataLen(rb);
{ if (avail == 0) return 0;
return RD_INVALUE; if (length > avail) length = avail;
}
/* whether has enough data */ unsigned short ri = ATOMIC_LOAD(&rb->m_sReadIndex, unsigned short, ATOMIC_ORDER_RELAXED);
size = rd_RingbufferDataLen(rb); unsigned char rb_m = ATOMIC_LOAD(&rb->m_bReadMirror, unsigned char, ATOMIC_ORDER_RELAXED);
/* no data */
if (size == 0)
{
return 0;
}
/* less data */ if (rb->m_iBufsize - ri > length) {
if (size < length) RD_MEMCPY(ptr, &rb->m_pcBufPtr[ri], length);
{ ri += length;
length = size; } else {
int first = rb->m_iBufsize - ri;
RD_MEMCPY(ptr, &rb->m_pcBufPtr[ri], first);
RD_MEMCPY(ptr + first, &rb->m_pcBufPtr[0], length - first);
rb_m ^= 1;
ri = length - first;
} }
if (rb->m_iBufsize - rb->m_sReadIndex > length) ATOMIC_STORE(&rb->m_sReadIndex, ri, unsigned short, ATOMIC_ORDER_RELEASE);
{ ATOMIC_STORE(&rb->m_bReadMirror, rb_m, unsigned char, ATOMIC_ORDER_RELEASE);
/* copy all of data */
RD_MEMCPY(ptr, &rb->m_pcBufPtr[rb->m_sReadIndex], length);
/* this should not cause overflow because there is enough space for
* length of data in current mirror */
rb->m_sReadIndex += length;
return length;
}
RD_MEMCPY(&ptr[0],
&rb->m_pcBufPtr[rb->m_sReadIndex],
rb->m_iBufsize - rb->m_sReadIndex);
RD_MEMCPY(&ptr[rb->m_iBufsize - rb->m_sReadIndex],
&rb->m_pcBufPtr[0],
length - (rb->m_iBufsize - rb->m_sReadIndex));
/* we are going into the other side of the mirror */
rb->m_bReadMirror ^= 1;
rb->m_sReadIndex = length - (rb->m_iBufsize - rb->m_sReadIndex);
return length; return length;
} }
@ -262,38 +238,15 @@ int rd_RingbufferGet(rd_ringbuf_t *rb, char *ptr, int length)
*/ */
int rd_RingbufferPeak(rd_ringbuf_t *rb, char **ptr) int rd_RingbufferPeak(rd_ringbuf_t *rb, char **ptr)
{ {
int size; if (!rb) return RD_INVALUE;
if (NULL == rb)
{
return RD_INVALUE;
}
*ptr = NULL; *ptr = NULL;
/* whether has enough data */ int avail = rd_RingbufferDataLen(rb);
size = rd_RingbufferDataLen(rb); if (avail == 0) return 0;
/* no data */
if (size == 0)
{
return 0;
}
*ptr = &rb->m_pcBufPtr[rb->m_sReadIndex]; unsigned short ri = ATOMIC_LOAD(&rb->m_sReadIndex, unsigned short, ATOMIC_ORDER_RELAXED);
*ptr = &rb->m_pcBufPtr[ri];
if((int)(rb->m_iBufsize - rb->m_sReadIndex) > size) return avail;
{
return size;
}
size = rb->m_iBufsize - rb->m_sReadIndex;
/* we are going into the other side of the mirror */
//rb->m_bReadMirror ^= 1;
//rb->m_sReadIndex = 0;
return size;
} }
/** /**
@ -306,30 +259,22 @@ int rd_RingbufferPeak(rd_ringbuf_t *rb, char **ptr)
*/ */
int rd_RingbufferPutchar(rd_ringbuf_t *rb, const char ch) int rd_RingbufferPutchar(rd_ringbuf_t *rb, const char ch)
{ {
if (NULL == rb) if (!rb) return RD_INVALUE;
{ if (!rd_RingbufferSpaceLen(rb)) return 0;
return RD_INVALUE;
}
/* whether has enough space */
if (!rd_RingbufferSpaceLen(rb))
{
return 0;
}
rb->m_pcBufPtr[rb->m_sWriteIndex] = ch; unsigned short wi = ATOMIC_LOAD(&rb->m_sWriteIndex, unsigned short, ATOMIC_ORDER_RELAXED);
unsigned char wb = ATOMIC_LOAD(&rb->m_bWriteMirror, unsigned char, ATOMIC_ORDER_RELAXED);
/* flip mirror */ rb->m_pcBufPtr[wi] = ch;
if (rb->m_sWriteIndex == rb->m_iBufsize-1) if (wi + 1 == rb->m_iBufsize) {
{ wb ^= 1;
rb->m_bWriteMirror ^= 1; wi = 0;
rb->m_sWriteIndex = 0; } else {
} wi++;
else
{
rb->m_sWriteIndex++;
} }
ATOMIC_STORE(&rb->m_sWriteIndex, wi, unsigned short, ATOMIC_ORDER_RELEASE);
ATOMIC_STORE(&rb->m_bWriteMirror, wb, unsigned char, ATOMIC_ORDER_RELEASE);
return 1; return 1;
} }
@ -343,37 +288,31 @@ int rd_RingbufferPutchar(rd_ringbuf_t *rb, const char ch)
*/ */
int rd_RingbufferPutcharForce(rd_ringbuf_t *rb, const char ch) int rd_RingbufferPutcharForce(rd_ringbuf_t *rb, const char ch)
{ {
enum ERingBufState old_state; if (!rb) return RD_INVALUE;
if (NULL == rb) enum ERingBufState old_state = rd_RingbufferStatus(rb);
{ unsigned short wi = ATOMIC_LOAD(&rb->m_sWriteIndex, unsigned short, ATOMIC_ORDER_RELAXED);
return RD_INVALUE; unsigned char wb = ATOMIC_LOAD(&rb->m_bWriteMirror, unsigned char, ATOMIC_ORDER_RELAXED);
}
rb->m_pcBufPtr[wi] = ch;
old_state = rd_RingbufferStatus(rb); if (wi + 1 == rb->m_iBufsize) {
wb ^= 1;
rb->m_pcBufPtr[rb->m_sWriteIndex] = ch; wi = 0;
if (old_state == RINGBUFFER_FULL) {
/* flip mirror */ unsigned char rb_m = ATOMIC_LOAD(&rb->m_bReadMirror, unsigned char, ATOMIC_ORDER_RELAXED);
if (rb->m_sWriteIndex == rb->m_iBufsize-1) rb_m ^= 1;
{ ATOMIC_STORE(&rb->m_bReadMirror, rb_m, unsigned char, ATOMIC_ORDER_RELEASE);
rb->m_bWriteMirror ^= 1; ATOMIC_STORE(&rb->m_sReadIndex, wi, unsigned short, ATOMIC_ORDER_RELEASE);
rb->m_sWriteIndex = 0;
if (old_state == RINGBUFFER_FULL)
{
rb->m_bReadMirror ^= 1;
rb->m_sReadIndex = rb->m_sWriteIndex;
} }
} } else {
else wi++;
{ if (old_state == RINGBUFFER_FULL) {
rb->m_sWriteIndex++; ATOMIC_STORE(&rb->m_sReadIndex, wi, unsigned short, ATOMIC_ORDER_RELEASE);
if (old_state == RINGBUFFER_FULL)
{
rb->m_sReadIndex = rb->m_sWriteIndex;
} }
} }
ATOMIC_STORE(&rb->m_sWriteIndex, wi, unsigned short, ATOMIC_ORDER_RELEASE);
ATOMIC_STORE(&rb->m_bWriteMirror, wb, unsigned char, ATOMIC_ORDER_RELEASE);
return 1; return 1;
} }
@ -388,30 +327,22 @@ int rd_RingbufferPutcharForce(rd_ringbuf_t *rb, const char ch)
*/ */
int rd_RingbufferGetchar(rd_ringbuf_t *rb, char *ch) int rd_RingbufferGetchar(rd_ringbuf_t *rb, char *ch)
{ {
if (NULL == rb) if (!rb) return RD_INVALUE;
{ if (!rd_RingbufferDataLen(rb)) return 0;
return RD_INVALUE;
}
/* ringbuffer is empty */
if (!rd_RingbufferDataLen(rb))
{
return 0;
}
/* put byte */ unsigned short ri = ATOMIC_LOAD(&rb->m_sReadIndex, unsigned short, ATOMIC_ORDER_RELAXED);
*ch = rb->m_pcBufPtr[rb->m_sReadIndex]; unsigned char rb_m = ATOMIC_LOAD(&rb->m_bReadMirror, unsigned char, ATOMIC_ORDER_RELAXED);
if (rb->m_sReadIndex == rb->m_iBufsize-1) *ch = rb->m_pcBufPtr[ri];
{ if (ri + 1 == rb->m_iBufsize) {
rb->m_bReadMirror ^= 1; rb_m ^= 1;
rb->m_sReadIndex = 0; ri = 0;
} } else {
else ri++;
{
rb->m_sReadIndex++;
} }
ATOMIC_STORE(&rb->m_sReadIndex, ri, unsigned short, ATOMIC_ORDER_RELEASE);
ATOMIC_STORE(&rb->m_bReadMirror, rb_m, unsigned char, ATOMIC_ORDER_RELEASE);
return 1; return 1;
} }
@ -424,26 +355,21 @@ int rd_RingbufferGetchar(rd_ringbuf_t *rb, char *ch)
*/ */
int rd_RingbufferDataLen(rd_ringbuf_t *rb) int rd_RingbufferDataLen(rd_ringbuf_t *rb)
{ {
switch (rd_RingbufferStatus(rb)) if (!rb) return RD_INVALUE;
{
case RINGBUFFER_EMPTY: unsigned short wi = ATOMIC_LOAD(&rb->m_sWriteIndex, unsigned short, ATOMIC_ORDER_ACQUIRE);
return 0; unsigned short ri = ATOMIC_LOAD(&rb->m_sReadIndex, unsigned short, ATOMIC_ORDER_RELAXED);
case RINGBUFFER_FULL: unsigned char wb = ATOMIC_LOAD(&rb->m_bWriteMirror, unsigned char, ATOMIC_ORDER_ACQUIRE);
return rb->m_iBufsize; unsigned char rb_m = ATOMIC_LOAD(&rb->m_bReadMirror, unsigned char, ATOMIC_ORDER_RELAXED);
case RINGBUFFER_HALFFULL:
default: if (wi == ri) {
{ return (wb == rb_m) ? 0 : rb->m_iBufsize;
int wi = rb->m_sWriteIndex, ri = rb->m_sReadIndex;
if (wi > ri)
{
return wi - ri;
}
else
{
return rb->m_iBufsize - (ri - wi);
}
} }
if (wb == rb_m) {
return wi - ri;
} else {
return rb->m_iBufsize - (ri - wi);
} }
} }
@ -454,15 +380,11 @@ int rd_RingbufferDataLen(rd_ringbuf_t *rb)
*/ */
void rd_RingbufferReset(rd_ringbuf_t *rb) void rd_RingbufferReset(rd_ringbuf_t *rb)
{ {
if(NULL == rb) if (!rb) return;
{ ATOMIC_STORE(&rb->m_sReadIndex, 0, unsigned short, ATOMIC_ORDER_RELAXED);
return; ATOMIC_STORE(&rb->m_sWriteIndex, 0, unsigned short, ATOMIC_ORDER_RELAXED);
} ATOMIC_STORE(&rb->m_bReadMirror, 0, unsigned char, ATOMIC_ORDER_RELAXED);
ATOMIC_STORE(&rb->m_bWriteMirror, 0, unsigned char, ATOMIC_ORDER_RELAXED);
rb->m_bReadMirror = 0;
rb->m_sReadIndex = 0;
rb->m_bWriteMirror = 0;
rb->m_sWriteIndex = 0;
} }
/** /**
@ -474,32 +396,19 @@ void rd_RingbufferReset(rd_ringbuf_t *rb)
*/ */
rd_ringbuf_t *rd_RingbufferCreate(int size) rd_ringbuf_t *rd_RingbufferCreate(int size)
{ {
rd_ringbuf_t *rb; if (size <= 0) return NULL;
char *pool;
if (size <= 0)
{
return NULL;
}
size = RD_ALIGN_DOWN(size, RD_ALIGN_SIZE); size = RD_ALIGN_DOWN(size, RD_ALIGN_SIZE);
rb = (rd_ringbuf_t *)RD_MALLOC(sizeof(rd_ringbuf_t)); rd_ringbuf_t *rb = (rd_ringbuf_t *)RD_MALLOC(sizeof(rd_ringbuf_t));
if (rb == NULL) if (!rb) return NULL;
{
goto exit; char *pool = (char *)RD_MALLOC(size);
} if (!pool) {
pool = (char *)RD_MALLOC(size);
if (pool == NULL)
{
RD_FREE(rb); RD_FREE(rb);
rb = NULL; return NULL;
goto exit;
} }
rd_RingbufferInit(rb, pool, size);
exit: rd_RingbufferInit(rb, pool, size);
return rb; return rb;
} }
@ -510,11 +419,7 @@ exit:
*/ */
void rd_RingbufferDestroy(rd_ringbuf_t *rb) void rd_RingbufferDestroy(rd_ringbuf_t *rb)
{ {
if (NULL == rb) if (!rb) return;
{
return;
}
RD_FREE(rb->m_pcBufPtr); RD_FREE(rb->m_pcBufPtr);
RD_FREE(rb); RD_FREE(rb);
} }

Loading…
Cancel
Save