@@ -42,12 +42,15 @@ typedef struct {
4242
4343static 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
4950static 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
5356static 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
6468static 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
157163int 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