ring_buf
Loading...
Searching...
No Matches
ring_buf.h
Go to the documentation of this file.
1/*
2 * SPDX-License-Identifier: MIT
3 * SPDX-FileCopyrightText: 2024, Roy Ratcliffe, Northumberland, United Kingdom
4 */
34#ifndef __RING_BUF_H__
35#define __RING_BUF_H__
36
37#ifdef __cplusplus
38extern "C" {
39#endif
40
41#include <errno.h>
42#include <stdbool.h>
43#include <stddef.h>
44
45#ifndef EMSGSIZE
51#define EMSGSIZE 115
52#endif
53
58typedef ptrdiff_t ring_buf_ptrdiff_t;
59
64typedef size_t ring_buf_size_t;
65
71#define RING_BUF_SIZE_MAX ((ring_buf_size_t)PTRDIFF_MIN)
72
112
128struct ring_buf {
133 void *space;
134
140
146
152};
153
160static inline ring_buf_size_t ring_buf_used_space(const struct ring_buf *buf) {
161 return buf->put.tail - buf->get.head;
162}
163
172static inline bool ring_buf_is_empty(const struct ring_buf *buf) {
173 return ring_buf_used_space(buf) == 0U;
174}
175
183static inline ring_buf_size_t ring_buf_free_space(const struct ring_buf *buf) {
184 return buf->size - (buf->put.head - buf->get.tail);
185}
186
195static inline bool ring_buf_is_full(const struct ring_buf *buf) {
196 return ring_buf_free_space(buf) == 0U;
197}
198
207
229ring_buf_size_t ring_buf_put_claim(struct ring_buf *buf, void **space,
230 ring_buf_size_t size);
231
243int ring_buf_put_ack(struct ring_buf *buf, ring_buf_size_t size);
244
258ring_buf_size_t ring_buf_get_claim(struct ring_buf *buf, void **space,
259 ring_buf_size_t size);
260
269int ring_buf_get_ack(struct ring_buf *buf, ring_buf_size_t size);
270
293ring_buf_size_t ring_buf_put(struct ring_buf *buf, const void *data,
294 ring_buf_size_t size);
295
304ring_buf_size_t ring_buf_get(struct ring_buf *buf, void *data,
305 ring_buf_size_t size);
306
316int ring_buf_put_all(struct ring_buf *buf, const void *data,
317 ring_buf_size_t size);
318
329int ring_buf_get_all(struct ring_buf *buf, void *data, ring_buf_size_t size);
330
335#include <stdint.h>
336
351#define RING_BUF_DEFINE_STATIC(_name_, _size_) \
352 static uint8_t _ring_buf_space_##_name_[_size_]; \
353 static struct ring_buf _name_ = {.space = _ring_buf_space_##_name_, \
354 .size = _size_}
355
360#ifdef __cplusplus
361}
362#endif
363
364#endif /* __RING_BUF_H__ */
int ring_buf_put_ack(struct ring_buf *buf, ring_buf_size_t size)
Acknowledges space claimed for putting data into a ring buffer.
Definition ring_buf.c:117
int ring_buf_get_ack(struct ring_buf *buf, ring_buf_size_t size)
Acknowledges space claimed for getting data from a ring buffer.
Definition ring_buf.c:143
ring_buf_size_t ring_buf_get_claim(struct ring_buf *buf, void **space, ring_buf_size_t size)
Claims contiguous space for getting.
Definition ring_buf.c:127
ring_buf_size_t ring_buf_put_claim(struct ring_buf *buf, void **space, ring_buf_size_t size)
Claims space for putting data into a ring buffer.
Definition ring_buf.c:101
ring_buf_size_t ring_buf_get(struct ring_buf *buf, void *data, ring_buf_size_t size)
Gets data from a ring buffer.
Definition ring_buf.c:166
int ring_buf_put_all(struct ring_buf *buf, const void *data, ring_buf_size_t size)
Puts all or none.
Definition ring_buf.c:181
ring_buf_size_t ring_buf_put(struct ring_buf *buf, const void *data, ring_buf_size_t size)
Puts non-contiguous bytes into the ring buffer.
Definition ring_buf.c:153
int ring_buf_get_all(struct ring_buf *buf, void *data, ring_buf_size_t size)
Gets all or none.
Definition ring_buf.c:191
static bool ring_buf_is_full(const struct ring_buf *buf)
Checks if the ring buffer is full.
Definition ring_buf.h:195
void ring_buf_reset(struct ring_buf *buf, ring_buf_ptrdiff_t base)
Resets a ring buffer.
Definition ring_buf.c:96
static bool ring_buf_is_empty(const struct ring_buf *buf)
Checks if the ring buffer is empty.
Definition ring_buf.h:172
static ring_buf_size_t ring_buf_free_space(const struct ring_buf *buf)
Calculates free space in the ring buffer.
Definition ring_buf.h:183
static ring_buf_size_t ring_buf_used_space(const struct ring_buf *buf)
Calculates used space in the ring buffer.
Definition ring_buf.h:160
size_t ring_buf_size_t
Ring buffer size type.
Definition ring_buf.h:64
ptrdiff_t ring_buf_ptrdiff_t
Ring buffer pointer difference type.
Definition ring_buf.h:58
Ring buffer zone.
Definition ring_buf.h:93
ring_buf_ptrdiff_t tail
Tail index of the zone.
Definition ring_buf.h:110
ring_buf_ptrdiff_t head
Head index of the zone.
Definition ring_buf.h:104
ring_buf_ptrdiff_t base
Base index of the zone.
Definition ring_buf.h:98
Ring buffer instance.
Definition ring_buf.h:128
ring_buf_size_t size
Size of the ring buffer.
Definition ring_buf.h:139
void * space
Pointer to the buffer's data space.
Definition ring_buf.h:133
struct ring_buf_zone get
Get zone.
Definition ring_buf.h:151
struct ring_buf_zone put
Put zone.
Definition ring_buf.h:145