Files
looper/engine/src/queue.c
2026-05-13 17:57:41 +00:00

32 lines
941 B
C

#include "queue.h"
#include <stdatomic.h>
#include <stdbool.h>
void queue_init(spsc_queue_t *q) {
/* nothing to allocate, just ensure head/tail start at 0 */
q->head = 0;
q->tail = 0;
}
bool queue_push(spsc_queue_t *q, command_t cmd) {
int h = atomic_load_explicit(&q->head, memory_order_relaxed);
int t = atomic_load_explicit(&q->tail, memory_order_acquire);
int next = (h + 1) % QUEUE_CAPACITY;
if (next == t)
return false; /* queue full */
q->buffer[h] = cmd;
atomic_store_explicit(&q->head, next, memory_order_release);
return true;
}
bool queue_pop(spsc_queue_t *q, command_t *cmd) {
int t = atomic_load_explicit(&q->tail, memory_order_relaxed);
int h = atomic_load_explicit(&q->head, memory_order_acquire);
if (t == h)
return false; /* queue empty */
*cmd = q->buffer[t];
atomic_store_explicit(&q->tail, (t + 1) % QUEUE_CAPACITY,
memory_order_release);
return true;
}