|
version 1.1.2.1, 2025/09/26 08:58:05
|
version 1.6, 2026/02/11 13:36:09
|
|
Line 12 terms:
|
Line 12 terms:
|
| All of the documentation and software included in the ELWIX and AITNET |
All of the documentation and software included in the ELWIX and AITNET |
| Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org> |
Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org> |
| |
|
| Copyright 2004 - 2025 | Copyright 2004 - 2026 |
| by Michael Pounov <misho@elwix.org>. All rights reserved. |
by Michael Pounov <misho@elwix.org>. All rights reserved. |
| |
|
| Redistribution and use in source and binary forms, with or without |
Redistribution and use in source and binary forms, with or without |
|
Line 46 SUCH DAMAGE.
|
Line 46 SUCH DAMAGE.
|
| #ifndef __ARING_H |
#ifndef __ARING_H |
| #define __ARING_H |
#define __ARING_H |
| |
|
| |
#define E_ATOMIC_ALIGN alignas(sizeof(int) * 8) |
| |
|
| typedef struct { |
typedef struct { |
| atomic_int rb_head; | E_ATOMIC_ALIGN int rb_head; |
| atomic_int rb_tail; | E E_ATOMIC_ALIGN int rb_tail; |
| int rb_bufnum; | int rb_bufnum; |
| struct iovec *rb_buffer; | struct iovec *rb_buffer; |
| } ringbuf_t; |
} ringbuf_t; |
| |
|
| |
typedef struct { |
| |
E_ATOMIC_ALIGN unsigned int lrb_head; |
| |
E_ATOMIC_ALIGN unsigned int lrb_tail; |
| |
E_ATOMIC_ALIGN unsigned int lrb_full; |
| |
int lrb_size; |
| |
unsigned char *lrb_data; |
| |
} lrbuf_t; |
| |
#define lrb_queued(x, r) do { \ |
| |
u_int _h, _t; \ |
| |
_t = atomic_load_explicit((atomic_int*) &(x)->lrb_tail, memory_order_acquire); \ |
| |
_h = atomic_load_explicit((atomic_int*) &(x)->lrb_head, memory_order_relaxed); \ |
| |
if (_h == _t) \ |
| |
(r) = atomic_load_explicit((atomic_int*) &(x)->lrb_full, memory_order_acquire) ? \ |
| |
(x)->lrb_size : 0; \ |
| |
else \ |
| |
(r) = (_h + (x)->lrb_size - _t) % (x)->lrb_size; \ |
| |
} while (0) |
| |
#define lrb_unused(x, r) do { \ |
| |
u_int _r; \ |
| |
lrb_queued((x), _r); \ |
| |
(r) = (x)->lrb_size - _r; \ |
| |
} while (0) |
| |
|
| |
|
| /* |
/* |
| * rbuf_init() - Init ring buffer |
* rbuf_init() - Init ring buffer |
| * |
* |
|
Line 108 int rbuf_enqueue(ringbuf_t *rbuf, void *data, size_t l
|
Line 132 int rbuf_enqueue(ringbuf_t *rbuf, void *data, size_t l
|
| * @out = Data, if =NULL, just dequeue data |
* @out = Data, if =NULL, just dequeue data |
| * return: -1 error, 1 buffer is empty or 0 ok |
* return: -1 error, 1 buffer is empty or 0 ok |
| */ |
*/ |
| int rbuf_dequeue(ringbuf_t *rbuf, struct iovec *out); | int rbuf_dequeue(ringbuf_t *rbuf, struct iovec **out); |
| | |
| | |
| | /* |
| | * lrb_init() - Init linear ring buffer |
| | * |
| | * @lrb = Linear ring buffer |
| | * @size = Size of ring buffer |
| | * return: -1 error or 0 ok |
| | */ |
| | int lrb_init(lrbuf_t *lrb, u_int size); |
| | /* |
| | * lrb_free() - Free linear ring buffer |
| | * |
| | * @lrb = Linear ring buffer |
| | * return: none |
| | */ |
| | void lrb_free(lrbuf_t *lrb); |
| | /* |
| | * lrb_purge() - Purge all buffer |
| | * |
| | * @lrb = Linear ring buffer |
| | * return: none |
| | */ |
| | void lrb_purge(lrbuf_t *lrb); |
| | /* |
| | * lrb_isempty() - Check buffer is empty |
| | * |
| | * @lrb = Linear ring buffer |
| | * return: -1 error, 0 it isn't empty |
| | */ |
| | int lrb_isempty(lrbuf_t *lrb); |
| | /* |
| | * lrb_isfull() - Check buffer is full |
| | * |
| | * @lrb = Linear ring buffer |
| | * return: -1 error or 0 it isn't full |
| | */ |
| | int lrb_isfull(lrbuf_t *lrb); |
| | /* |
| | * lrb_enqueue() - Enqueue data to buffer |
| | * |
| | * @lrb = Linear ring buffer |
| | * @data = Data |
| | * @len = Length |
| | * @lost = Permit to lost data |
| | * return: -1 error, 1 buffer is full or 0 ok |
| | */ |
| | int lrb_enqueue(lrbuf_t *lrb, void *data, size_t len, int lost); |
| | /* |
| | * lrb_dequeue() - Dequeue data from buffer |
| | * |
| | * @lrb = Linear ring buffer |
| | * @data = Data, if =NULL, just dequeue data |
| | * @len = Length of data |
| | * return: -1 error, 0 buffer is empty or >0 stored data bytes |
| | */ |
| | int lrb_dequeue(lrbuf_t *lrb, void *data, size_t len); |
| | /* |
| | * lrb_getw() - Get address for write |
| | * |
| | * @lrb = Linear ring buffer |
| | * @len = Return available buffer length for write |
| | * return: NULL error or !=NULL pointer for write |
| | * remark: After use of lrb_getw() and write to pointer. |
| | * You should update ring buffer with lrb_enqueue(,NULL,wrote_len,) |
| | */ |
| | void *lrb_getw(lrbuf_t *lrb, size_t *len); |
| | /* |
| | * lrb_getr() - Get address for read |
| | * |
| | * @lrb = Linear ring buffer |
| | * @len = Return available data length for read |
| | * return: NULL error or !=NULL pointer for read |
| | * remark: After use of lrb_getr() and read from pointer. |
| | * You could update ring buffer with lrb_dequeue(,NULL,read_len) |
| | */ |
| | void *lrb_getr(lrbuf_t *lrb, size_t *len); |
| |
|
| |
|
| #endif |
#endif |