Skip to content

Single-Producer Single-Consumer Lock-Free FIFO

include/structures/spsc_fifo.h View source View on GitHub
struct spsc_fifo {
    _Atomic size_t  head;
    _Atomic size_t  tail;
    size_t          size;
    size_t          mask;
    uint8_t         *data;
};
bool spsc_fifo_init(struct spsc_fifo *fifo, size_t size);
void spsc_fifo_init_with(struct spsc_fifo *fifo, void *buffer, size_t size);
void spsc_fifo_destroy(struct spsc_fifo *fifo);
size_t spsc_fifo_write(struct spsc_fifo *fifo, const void *src, size_t len);
size_t spsc_fifo_read(struct spsc_fifo *fifo, void *dst, size_t len);
size_t spsc_fifo_peek(const struct spsc_fifo *fifo, void *dst, size_t len);
bool spsc_fifo_push_ptr(struct spsc_fifo *fifo, const void *ptr);
bool spsc_fifo_pop_ptr(struct spsc_fifo *fifo, void **out_ptr);
size_t spsc_fifo_len(const struct spsc_fifo *fifo);
size_t spsc_fifo_avail(const struct spsc_fifo *fifo);
bool spsc_fifo_is_empty(const struct spsc_fifo *fifo);
bool spsc_fifo_is_full(const struct spsc_fifo *fifo);
void spsc_fifo_reset(struct spsc_fifo *fifo);
#define SPSC_FIFO_INIT \
    (struct spsc_fifo) { \
        .head = 0, .tail = 0, .size = 0, .mask = 0, .data = NULL \
    }