Skip to content

Commit a12f2e2

Browse files
author
shangjinlong
committed
[FIX] Fix ringbuf impl
1 parent 05232e0 commit a12f2e2

1 file changed

Lines changed: 23 additions & 16 deletions

File tree

ringbuf/src/uni_ringbuf.c

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,15 @@ typedef struct {
4242

4343
static RingBuf *_create_ring_buf() {
4444
RingBuf *ring_buf = (RingBuf *)malloc(sizeof(RingBuf));
45-
ring_buf->head = ring_buf->tail = 0;
45+
__atomic_store_n(&ring_buf->head, 0, __ATOMIC_RELAXED);
46+
__atomic_store_n(&ring_buf->tail, 0, __ATOMIC_RELAXED);
4647
return ring_buf;
4748
}
4849

4950
static int _get_data_size(RingBuf *ring_buf) {
50-
return (ring_buf->head + ring_buf->size - ring_buf->tail) % ring_buf->size;
51+
int head = __atomic_load_n(&ring_buf->head, __ATOMIC_ACQUIRE);
52+
int tail = __atomic_load_n(&ring_buf->tail, __ATOMIC_ACQUIRE);
53+
return (head + ring_buf->size - tail) % ring_buf->size;
5154
}
5255

5356
static int _get_free_size(RingBuf *ring_buf) {
@@ -58,7 +61,8 @@ static void _init_ring_buf(void *ring_buf, int size) {
5861
RingBuf *buf = (RingBuf *)ring_buf;
5962
buf->size = size + RINGBBUF_FILL_BYTE_SIZE;
6063
buf->buf = (char *)malloc(size + RINGBBUF_FILL_BYTE_SIZE);
61-
buf->head = buf->tail = 0;
64+
__atomic_store_n(&buf->head, 0, __ATOMIC_RELAXED);
65+
__atomic_store_n(&buf->tail, 0, __ATOMIC_RELAXED);
6266
}
6367

6468
static inline int _read_attr_setted(RingBufferAttr attr) {
@@ -85,18 +89,19 @@ static int _read_internal(RingBufferHandle handle, char *buf, int size,
8589
RingBufferAttr attr) {
8690
RingBuf *ring_buf = (RingBuf *)handle;
8791
int pos, remain;
88-
pos = (ring_buf->tail + size) % ring_buf->size;
92+
int tail = __atomic_load_n(&ring_buf->tail, __ATOMIC_RELAXED);
93+
pos = (tail + size) % ring_buf->size;
8994
if (_read_attr_setted(attr)) {
90-
if (pos >= ring_buf->tail) {
91-
memcpy(buf, ring_buf->buf + ring_buf->tail, size);
95+
if (pos >= tail) {
96+
memcpy(buf, ring_buf->buf + tail, size);
9297
} else {
93-
remain = (ring_buf->size - ring_buf->tail);
94-
memcpy(buf, ring_buf->buf + ring_buf->tail, remain);
98+
remain = (ring_buf->size - tail);
99+
memcpy(buf, ring_buf->buf + tail, remain);
95100
memcpy(buf + remain, ring_buf->buf, size - remain);
96101
}
97102
}
98103
if (_sync_attr_setted(attr)) {
99-
ring_buf->tail = pos;
104+
__atomic_store_n(&ring_buf->tail, pos, __ATOMIC_RELEASE);
100105
}
101106
return size;
102107
}
@@ -105,18 +110,19 @@ static int _write_internal(RingBufferHandle handle, char *buf, int size,
105110
RingBufferAttr attr) {
106111
RingBuf *ring_buf = (RingBuf *)handle;
107112
int pos, remain;
108-
pos = (ring_buf->head + size) % ring_buf->size;
113+
int head = __atomic_load_n(&ring_buf->head, __ATOMIC_RELAXED);
114+
pos = (head + size) % ring_buf->size;
109115
if (_write_attr_setted(attr)) {
110-
if (pos >= ring_buf->head) {
111-
memcpy(ring_buf->buf + ring_buf->head, buf, size);
116+
if (pos >= head) {
117+
memcpy(ring_buf->buf + head, buf, size);
112118
} else {
113-
remain = (ring_buf->size - ring_buf->head);
114-
memcpy(ring_buf->buf + ring_buf->head, buf, remain);
119+
remain = (ring_buf->size - head);
120+
memcpy(ring_buf->buf + head, buf, remain);
115121
memcpy(ring_buf->buf, buf + remain, size - remain);
116122
}
117123
}
118124
if (_sync_attr_setted(attr)) {
119-
ring_buf->head = pos;
125+
__atomic_store_n(&ring_buf->head, pos, __ATOMIC_RELEASE);
120126
}
121127
return size;
122128
}
@@ -156,7 +162,8 @@ static int _ring_buffer_write(RingBufferHandle handle, char *src, int writelen,
156162

157163
int RingBufferClear(RingBufferHandle handle) {
158164
RingBuf *ring_buf = (RingBuf *)handle;
159-
ring_buf->head = ring_buf->tail = 0;
165+
__atomic_store_n(&ring_buf->head, 0, __ATOMIC_RELEASE);
166+
__atomic_store_n(&ring_buf->tail, 0, __ATOMIC_RELEASE);
160167
return 0;
161168
}
162169

0 commit comments

Comments
 (0)