|
|
|
@ -395,6 +395,7 @@ int rd_RingbufferGetchar(rd_ringbuf_t *rb, char *ch) |
|
|
|
int rd_RingbufferDataLen(rd_ringbuf_t *rb) |
|
|
|
{ |
|
|
|
if (!rb) return RD_INVALUE; |
|
|
|
int iRet = 0; |
|
|
|
|
|
|
|
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); |
|
|
|
@ -402,13 +403,23 @@ int rd_RingbufferDataLen(rd_ringbuf_t *rb) |
|
|
|
unsigned char rb_m = ATOMIC_LOAD(&rb->m_bReadMirror, unsigned char, ATOMIC_ORDER_RELAXED); |
|
|
|
|
|
|
|
if (wi == ri) { |
|
|
|
return (wb == rb_m) ? 0 : rb->m_iBufsize; |
|
|
|
iRet = (wb == rb_m) ? 0 : rb->m_iBufsize; |
|
|
|
} |
|
|
|
|
|
|
|
if (wb == rb_m) { |
|
|
|
return wi - ri; |
|
|
|
iRet = wi - ri; |
|
|
|
} else { |
|
|
|
return rb->m_iBufsize - (ri - wi); |
|
|
|
iRet = rb->m_iBufsize - (ri - wi); |
|
|
|
} |
|
|
|
|
|
|
|
if (iRet >= 0) |
|
|
|
{ |
|
|
|
return iRet; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
log_e("wb = %d, rb_m = %d, wi = %d, ri = %d", wb, rb_m, wi, ri); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|