--- libelwix/src/ring.c 2026/02/18 11:39:03 1.7.2.1 +++ libelwix/src/ring.c 2026/07/27 21:11:07 1.10 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: ring.c,v 1.7.2.1 2026/02/18 11:39:03 misho Exp $ +* $Id: ring.c,v 1.10 2026/07/27 21:11:07 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -59,9 +59,9 @@ rbuf_init(ringbuf_t *rbuf, int num) if (!rbuf) return -1; - atomic_store_explicit((atomic_int*) &rbuf->rb_head, 0, memory_order_relaxed); - atomic_store_explicit((atomic_int*) &rbuf->rb_tail, 0, memory_order_relaxed); - atomic_store_explicit((atomic_int*) &rbuf->rb_full, 0, memory_order_relaxed); + atomic_store_explicit((atomic_int*) &rbuf->rb_head, 0, memory_order_release); + atomic_store_explicit((atomic_int*) &rbuf->rb_tail, 0, memory_order_release); + atomic_store_explicit((atomic_int*) &rbuf->rb_full, 0, memory_order_release); rbuf->rb_buffer = e_calloc(num, sizeof(struct iovec)); if (!rbuf->rb_buffer) @@ -91,9 +91,9 @@ rbuf_free(ringbuf_t *rbuf) rbuf->rb_bufnum = 0; } - atomic_store_explicit((atomic_int*) &rbuf->rb_head, 0, memory_order_relaxed); - atomic_store_explicit((atomic_int*) &rbuf->rb_tail, 0, memory_order_relaxed); - atomic_store_explicit((atomic_int*) &rbuf->rb_full, 0, memory_order_relaxed); + atomic_store_explicit((atomic_int*) &rbuf->rb_head, 0, memory_order_release); + atomic_store_explicit((atomic_int*) &rbuf->rb_tail, 0, memory_order_release); + atomic_store_explicit((atomic_int*) &rbuf->rb_full, 0, memory_order_release); } /* @@ -111,9 +111,9 @@ rbuf_purge(ringbuf_t *rbuf) if (rbuf->rb_buffer) memset(rbuf->rb_buffer, 0, rbuf->rb_bufnum * sizeof(struct iovec)); - atomic_store_explicit((atomic_int*) &rbuf->rb_head, 0, memory_order_relaxed); - atomic_store_explicit((atomic_int*) &rbuf->rb_tail, 0, memory_order_relaxed); - atomic_store_explicit((atomic_int*) &rbuf->rb_full, 0, memory_order_relaxed); + atomic_store_explicit((atomic_int*) &rbuf->rb_head, 0, memory_order_release); + atomic_store_explicit((atomic_int*) &rbuf->rb_tail, 0, memory_order_release); + atomic_store_explicit((atomic_int*) &rbuf->rb_full, 0, memory_order_release); } /* @@ -214,10 +214,11 @@ rbuf_enqueue(ringbuf_t *rbuf, void *data, size_t len, * * @rbuf = Ring buffer * @out = Data, if =NULL, just dequeue data + * @peek = Peek only data, keep the same tail position * return: -1 error, 1 buffer is empty or 0 ok */ int -rbuf_dequeue(ringbuf_t *rbuf, struct iovec **out) +rbuf_dequeue(ringbuf_t *rbuf, struct iovec **out, int peek) { int h, t, n, f; @@ -234,12 +235,15 @@ rbuf_dequeue(ringbuf_t *rbuf, struct iovec **out) n = (t + 1) % rbuf->rb_bufnum; + if (out) + *out = rbuf->rb_buffer + t; + + if (peek) + break; + f = t; if (atomic_compare_exchange_weak_explicit((atomic_int*) &rbuf->rb_tail, &f, n, memory_order_release, memory_order_relaxed)) { - if (out) - *out = rbuf->rb_buffer + t; - atomic_store_explicit((atomic_int*) &rbuf->rb_full, 0, memory_order_release); break; } @@ -262,9 +266,9 @@ lrb_init(lrbuf_t *lrb, u_int size) if (!lrb) return -1; - atomic_store_explicit((atomic_int*) &lrb->lrb_head, 0, memory_order_relaxed); - atomic_store_explicit((atomic_int*) &lrb->lrb_tail, 0, memory_order_relaxed); - atomic_store_explicit((atomic_int*) &lrb->lrb_full, 0, memory_order_relaxed); + atomic_store_explicit((atomic_int*) &lrb->lrb_head, 0, memory_order_release); + atomic_store_explicit((atomic_int*) &lrb->lrb_tail, 0, memory_order_release); + atomic_store_explicit((atomic_int*) &lrb->lrb_full, 0, memory_order_release); lrb->lrb_data = e_malloc(size); if (!lrb->lrb_data) @@ -294,9 +298,9 @@ lrb_free(lrbuf_t *lrb) lrb->lrb_size = 0; } - atomic_store_explicit((atomic_int*) &lrb->lrb_head, 0, memory_order_relaxed); - atomic_store_explicit((atomic_int*) &lrb->lrb_tail, 0, memory_order_relaxed); - atomic_store_explicit((atomic_int*) &lrb->lrb_full, 0, memory_order_relaxed); + atomic_store_explicit((atomic_int*) &lrb->lrb_head, 0, memory_order_release); + atomic_store_explicit((atomic_int*) &lrb->lrb_tail, 0, memory_order_release); + atomic_store_explicit((atomic_int*) &lrb->lrb_full, 0, memory_order_release); } /* @@ -314,9 +318,9 @@ lrb_purge(lrbuf_t *lrb) if (lrb->lrb_data) memset(lrb->lrb_data, 0, lrb->lrb_size); - atomic_store_explicit((atomic_int*) &lrb->lrb_head, 0, memory_order_relaxed); - atomic_store_explicit((atomic_int*) &lrb->lrb_tail, 0, memory_order_relaxed); - atomic_store_explicit((atomic_int*) &lrb->lrb_full, 0, memory_order_relaxed); + atomic_store_explicit((atomic_int*) &lrb->lrb_head, 0, memory_order_release); + atomic_store_explicit((atomic_int*) &lrb->lrb_tail, 0, memory_order_release); + atomic_store_explicit((atomic_int*) &lrb->lrb_full, 0, memory_order_release); } /* @@ -377,7 +381,7 @@ lrb_getw(lrbuf_t *lrb, size_t *len) if (!lrb || !lrb->lrb_data || !lrb->lrb_size) return NULL; - h = atomic_load_explicit((atomic_int*) &lrb->lrb_head, memory_order_relaxed); + h = atomic_load_explicit((atomic_int*) &lrb->lrb_head, memory_order_acquire); if (len) *len = lrb->lrb_size - h; @@ -417,7 +421,7 @@ lrb_enqueue(lrbuf_t *lrb, void *data, size_t len, int t = atomic_load_explicit((atomic_int*) &lrb->lrb_tail, memory_order_acquire); t2 = (t + drop) % lrb->lrb_size; } - h = atomic_load_explicit((atomic_int*) &lrb->lrb_head, memory_order_relaxed); + h = atomic_load_explicit((atomic_int*) &lrb->lrb_head, memory_order_acquire); n = lrb->lrb_size - h; if (len < n) { if (data) @@ -478,10 +482,11 @@ lrb_getr(lrbuf_t *lrb, size_t *len) * @lrb = Linear ring buffer * @data = Data, if =NULL, just dequeue data * @len = Length of data + * @peek = Peek only data, keep the same tail position * return: -1 error, 0 buffer is empty or >0 stored data bytes */ int -lrb_dequeue(lrbuf_t *lrb, void *data, size_t len) +lrb_dequeue(lrbuf_t *lrb, void *data, size_t len, int peek) { int h, t, t2, n, l, f; @@ -520,6 +525,9 @@ lrb_dequeue(lrbuf_t *lrb, void *data, size_t len) } t2 = l - n; } + + if (peek) + return l; n = t; if (atomic_compare_exchange_weak_explicit((atomic_int*) &lrb->lrb_tail,