From 7619d5fda53d35cd9cd3cc1914b8cda83d1be875 Mon Sep 17 00:00:00 2001 From: Lizongdi <1210855344@qq.com> Date: Tue, 29 Sep 2026 14:20:53 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E4=B8=BB=E7=BA=BF=E5=BE=85=E5=90=88?= =?UTF-8?q?=E3=80=91=E5=B0=9D=E8=AF=95=E8=A7=A3=E5=86=B3ringbuffer?= =?UTF-8?q?=E7=9A=84memcpy=E4=BC=A0=E5=8F=82=E4=B8=BA=E8=B4=9F=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- library/ringbuffer/ringbuffer.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/library/ringbuffer/ringbuffer.c b/library/ringbuffer/ringbuffer.c index 3139447..20e0020 100644 --- a/library/ringbuffer/ringbuffer.c +++ b/library/ringbuffer/ringbuffer.c @@ -120,23 +120,31 @@ int rd_RingbufferPut(rd_ringbuf_t *rb, const char *ptr, int length) { if (!rb || !ptr || length <= 0) return RD_INVALUE; - int space = rd_RingbufferSpaceLen(rb); - if (space == 0) return 0; - if (space < length) length = space; - unsigned short wi = ATOMIC_LOAD(&rb->m_sWriteIndex, unsigned short, ATOMIC_ORDER_RELAXED); + 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_RELAXED); + unsigned char rb_m = ATOMIC_LOAD(&rb->m_bReadMirror, unsigned char, ATOMIC_ORDER_RELAXED); + + int space; + if (wb == rb_m) { + space = rb->m_iBufsize - (int)(unsigned short)(wi - ri); + } else { + space = (int)(unsigned short)(ri - wi); + } + + if (space <= 0) return 0; + if (space < length) length = space; /* 写入不跨越尾部 */ - if (rb->m_iBufsize - wi > length) { + int tail = rb->m_iBufsize - wi; + if (tail > length) { RD_MEMCPY(&rb->m_pcBufPtr[wi], ptr, length); wi += length; } else { - int first = rb->m_iBufsize - wi; - RD_MEMCPY(&rb->m_pcBufPtr[wi], ptr, first); - RD_MEMCPY(&rb->m_pcBufPtr[0], ptr + first, length - first); + RD_MEMCPY(&rb->m_pcBufPtr[wi], ptr, tail); + RD_MEMCPY(&rb->m_pcBufPtr[0], ptr + tail, length - tail); wb ^= 1; /* 翻转镜像位 */ - wi = length - first; + wi = length - tail; } ATOMIC_STORE(&rb->m_sWriteIndex, wi, unsigned short, ATOMIC_ORDER_RELEASE);