--- libelwix/inc/elwix/aring.h 2026/02/16 10:05:28 1.7 +++ libelwix/inc/elwix/aring.h 2026/02/18 01:23:04 1.7.2.1 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aring.h,v 1.7 2026/02/16 10:05:28 misho Exp $ +* $Id: aring.h,v 1.7.2.1 2026/02/18 01:23:04 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -54,6 +54,30 @@ typedef struct { int rb_bufnum; struct iovec *rb_buffer; } ringbuf_t; +#define rbuf_head(x) atomic_load_explicit((atomic_int*) &(x)->rb_head, memory_order_relaxed) +#define rbuf_tail(x) atomic_load_explicit((atomic_int*) &(x)->rb_tail, memory_order_relaxed) +#define rbuf_hptr(x) ((x)->rb_buffer + rbuf_head((x))) +#define rbuf_tptr(x) ((x)->rb_buffer + rbuf_tail((x))) +#define rbuf_ptr(x, n) ((x)->rb_buffer + ((rbuf_tail((x)) + (n)) % (x)->rb_bufnum)) +#define rbuf_num(x) ((x)->rb_bufnum) +#define rbuf_getb(x) ((x)->rb_buffer) +#define rbuf_get(x, n) *rbuf_ptr((x), (n)) +#define rbuf_isrewind(x) (rbuf_head((x)) < rbuf_tail((x))) +#define rbuf_queued(x, r) do { \ + u_int _h, _t; \ + _t = atomic_load_explicit((atomic_int*) &(x)->rb_tail, memory_order_acquire); \ + _h = atomic_load_explicit((atomic_int*) &(x)->rb_head, memory_order_relaxed); \ + if (_h == _t) \ + (r) = 0; \ + else \ + (r) = (_h + (x)->rb_bufnum - _t) % (x)->rb_bufnum; \ + } while (0) +#define rbuf_unused(x, r) do { \ + u_int _r; \ + rbuf_queued((x), _r); \ + (r) = (x)->rb_bufnum - _r; \ + } while (0) + typedef struct { E_ATOMIC_ALIGN unsigned int lrb_head;