/* mpmc.h — bounded lock-free queue of pointers (Dmitry Vyukov's algorithm). * * One implementation covers every cross-thread hand-off in the engine: * - control-plane -> reactor command queues (MPSC usage) * - reactor -> hash worker pool job queue (MPMC usage) * - worker -> reactor completion queue (MPSC usage) * Wait-free in the common case, no per-op allocation. Capacity is fixed at * init and must be a power of two. */ #ifndef NAUT_MPMC_H #define NAUT_MPMC_H #include "naut/common.h" typedef struct naut_mpmc_cell { _Atomic size_t seq; void *data; } naut_mpmc_cell; typedef struct naut_mpmc { NAUT_CACHE_ALIGNED naut_mpmc_cell *buffer; size_t mask; NAUT_CACHE_ALIGNED _Atomic size_t enqueue_pos; NAUT_CACHE_ALIGNED _Atomic size_t dequeue_pos; } naut_mpmc; naut_err naut_mpmc_init(naut_mpmc *q, size_t capacity_pow2); void naut_mpmc_destroy(naut_mpmc *q); /* Both return false without blocking when full/empty respectively. */ bool naut_mpmc_push(naut_mpmc *q, void *p); bool naut_mpmc_pop(naut_mpmc *q, void **out); #endif /* NAUT_MPMC_H */