Skip to content

File syn_spsc_queue.h

File List > src > syntropic > util > syn_spsc_queue.h

Go to the documentation of this file

#ifndef SYN_SPSC_QUEUE_H
#define SYN_SPSC_QUEUE_H

#include "../common/syn_defs.h"

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef struct {
    uint8_t *buffer;      
    size_t elem_size;     
    size_t capacity;      
    volatile size_t head; 
    volatile size_t tail; 
} SYN_SPSC_Queue;

SYN_Status syn_spsc_queue_init(SYN_SPSC_Queue *q, void *elem_buf, size_t elem_size,
                               size_t capacity);

SYN_Status syn_spsc_queue_push(SYN_SPSC_Queue *q, const void *item);

SYN_Status syn_spsc_queue_pop(SYN_SPSC_Queue *q, void *out_item);

bool syn_spsc_queue_is_empty(const SYN_SPSC_Queue *q);

bool syn_spsc_queue_is_full(const SYN_SPSC_Queue *q);

size_t syn_spsc_queue_count(const SYN_SPSC_Queue *q);

/* ── Protothread & Task Integration ─────────────────────────────────────── */

#include "../pt/syn_pt.h"

#define PT_QUEUE_WAIT_POP(pt, q) PT_WAIT_UNTIL(pt, !syn_spsc_queue_is_empty(q))

#define PT_BLOCK_QUEUE_POP(pt, task, q) PT_BLOCK_CONDITION(pt, task, !syn_spsc_queue_is_empty(q))

#ifdef __cplusplus
}
#endif

#endif /* SYN_SPSC_QUEUE_H */