Skip to content

Single-Producer Single-Consumer Lock-Free FIFO Ring

include/structures/spsc_fifo_ring.h View source View on GitHub
struct spsc_fifo_ring (5 fields) source

Written by Producer

Written by Consumer

§ size_t size
Capacity (pow2)
§ size_t mask

size - 1

§ uint8_t *data
bool spsc_fifo_ring_init(struct spsc_fifo_ring *fifo, size_t size)
source

(rounded to power of 2)

void spsc_fifo_ring_init_with(
    struct spsc_fifo_ring *fifo,
    void *buffer,
    size_t size
)
source
void spsc_fifo_ring_destroy(struct spsc_fifo_ring *fifo)
source
size_t spsc_fifo_ring_write(
    struct spsc_fifo_ring *fifo,
    const void *src,
    size_t len
)
source
size_t spsc_fifo_ring_read(
    struct spsc_fifo_ring *fifo,
    void *dst,
    size_t len
)
source
size_t spsc_fifo_ring_peek(
    const struct spsc_fifo_ring *fifo,
    void *dst,
    size_t len
)
source

peek up to len bytes into dst without consuming

bool spsc_fifo_ring_push_ptr(
    struct spsc_fifo_ring *fifo,
    const void *ptr
)
source
bool spsc_fifo_ring_pop_ptr(
    struct spsc_fifo_ring *fifo,
    void **out_ptr
)
source
size_t spsc_fifo_ring_len(const struct spsc_fifo_ring *fifo)
source
size_t spsc_fifo_ring_avail(const struct spsc_fifo_ring *fifo)
source
bool spsc_fifo_ring_is_empty(const struct spsc_fifo_ring *fifo)
source
bool spsc_fifo_ring_is_full(const struct spsc_fifo_ring *fifo)
source
void spsc_fifo_ring_reset(struct spsc_fifo_ring *fifo)
source
#define SPSC_FIFO_RING_INIT
source
Expansion
#define SPSC_FIFO_RING_INIT \
    (struct spsc_fifo_ring) { \
        .head = 0, .tail = 0, .size = 0, .mask = 0, .data = NULL \
    }