|
|
| version 1.5.2.1, 2026/02/10 18:23:53 | version 1.6, 2026/02/11 13:36:09 |
|---|---|
| Line 329 lrb_isfull(lrbuf_t *lrb) | Line 329 lrb_isfull(lrbuf_t *lrb) |
| } | } |
| /* | /* |
| * 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) | |
| { | |
| int h; | |
| if (!lrb || !lrb->lrb_data || !lrb->lrb_size) | |
| return NULL; | |
| h = atomic_load_explicit((atomic_int*) &lrb->lrb_head, memory_order_relaxed); | |
| if (len) | |
| *len = lrb->lrb_size - h; | |
| return (lrb->lrb_data + h); | |
| } | |
| /* | |
| * lrb_enqueue() - Enqueue data to buffer | * lrb_enqueue() - Enqueue data to buffer |
| * | * |
| * @lrb = Linear ring buffer | * @lrb = Linear ring buffer |
| Line 364 lrb_enqueue(lrbuf_t *lrb, void *data, size_t len, int | Line 388 lrb_enqueue(lrbuf_t *lrb, void *data, size_t len, int |
| h = atomic_load_explicit((atomic_int*) &lrb->lrb_head, memory_order_relaxed); | h = atomic_load_explicit((atomic_int*) &lrb->lrb_head, memory_order_relaxed); |
| n = lrb->lrb_size - h; | n = lrb->lrb_size - h; |
| if (len < n) { | if (len < n) { |
| memcpy(lrb->lrb_data + h, data, len); | if (data) |
| memcpy(lrb->lrb_data + h, data, len); | |
| n = h + len; | n = h + len; |
| } else { | } else { |
| memcpy(lrb->lrb_data + h, data, n); | if (data) { |
| memcpy(lrb->lrb_data, data + n, len - n); | memcpy(lrb->lrb_data + h, data, n); |
| memcpy(lrb->lrb_data, data + n, len - n); | |
| } | |
| n = len - n; | n = len - n; |
| } | } |
| Line 387 lrb_enqueue(lrbuf_t *lrb, void *data, size_t len, int | Line 414 lrb_enqueue(lrbuf_t *lrb, void *data, size_t len, int |
| t2 = atomic_load_explicit((atomic_int*) &lrb->lrb_tail, memory_order_acquire); | t2 = atomic_load_explicit((atomic_int*) &lrb->lrb_tail, memory_order_acquire); |
| atomic_store_explicit((atomic_int*) &lrb->lrb_full, (h == t2), memory_order_release); | atomic_store_explicit((atomic_int*) &lrb->lrb_full, (h == t2), memory_order_release); |
| return 0; | return 0; |
| } | |
| /* | |
| * 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) | |
| { | |
| int t; | |
| if (!lrb || !lrb->lrb_data || !lrb->lrb_size) | |
| return NULL; | |
| t = atomic_load_explicit((atomic_int*) &lrb->lrb_tail, memory_order_acquire); | |
| if (len) | |
| lrb_queued(lrb, *len); | |
| return (lrb->lrb_data + t); | |
| } | } |
| /* | /* |