11#ifndef MMGR_CONFINIUM_EXCLUSIVUM_INFINITAS_H
12#define MMGR_CONFINIUM_EXCLUSIVUM_INFINITAS_H
14#include "config/mmgr_config.h"
39#ifndef MMGR_RING_WORDS
41#define MMGR_RING_WORDS 40u
49#define MMGR_RING_LOCULI_MAX MMGR_WORD_BITS
58#ifndef MMGR_RING_LOCULI
60#define MMGR_RING_LOCULI 8u
64 MMGR_RING_LOCULI <= MMGR_RING_LOCULI_MAX,
65 "the loculus masks are one machine word; widen them or fall back to a scan past MMGR_RING_LOCULI_MAX");
74#define MMGR_RING_POW2(cap) (((cap) & ((cap) - 1u)) == 0u)
84#define MMGR_RING_WRAP(i, cap) ((i) & ((cap) - 1u))
147MMGR_NS_LAYOUT(
InfinitasNs, init, available, vacant, read_byte, read, peek, consume, put, seg_inflight, seg_next,
148 seg_publish, seg_front, seg_release, seg_at, loculus_ready, loculus_next, loculus_hold, loculus_keepout,
149 loculus_drop, loculus_mark);
161mmgr_bool mmgr_infin_init(
const InfinCfg *c);
170size_t mmgr_infin_available(
const InfinCfg *c);
180size_t mmgr_infin_vacant(
const InfinCfg *c);
191mmgr_bool mmgr_infin_read_byte(
const InfinCfg *c);
202size_t mmgr_infin_read(
const InfinCfg *c);
212void mmgr_infin_peek(
const InfinCfg *c);
220void mmgr_infin_consume(
const InfinCfg *c);
231mmgr_bool mmgr_infin_put(
const InfinCfg *c);
239size_t mmgr_infin_seg_inflight(
const InfinCfg *c);
248mmgr_bool mmgr_infin_seg_next(
const InfinCfg *c);
255void mmgr_infin_seg_publish(
const InfinCfg *c);
263mmgr_bool mmgr_infin_seg_front(
const InfinCfg *c);
271void mmgr_infin_seg_release(
const InfinCfg *c);
279uint8_t *mmgr_infin_seg_at(
const InfinCfg *c);
288mmgr_word mmgr_infin_loculus_ready(
const InfinCfg *c);
297mmgr_iword mmgr_infin_loculus_next(
const InfinCfg *c);
307mmgr_bool mmgr_infin_loculus_hold(
const InfinCfg *c);
324void mmgr_infin_loculus_drop(
const InfinCfg *c);
331void mmgr_infin_loculus_mark(
const InfinCfg *c);
333MMGR_NS
InfinitasNs iteratio_infinita MMGR_UNUSED = {
334 .init = mmgr_infin_init,
335 .available = mmgr_infin_available,
336 .vacant = mmgr_infin_vacant,
337 .read_byte = mmgr_infin_read_byte,
338 .read = mmgr_infin_read,
339 .peek = mmgr_infin_peek,
340 .consume = mmgr_infin_consume,
341 .put = mmgr_infin_put,
342 .seg_inflight = mmgr_infin_seg_inflight,
343 .seg_next = mmgr_infin_seg_next,
344 .seg_publish = mmgr_infin_seg_publish,
345 .seg_front = mmgr_infin_seg_front,
346 .seg_release = mmgr_infin_seg_release,
347 .seg_at = mmgr_infin_seg_at,
348 .loculus_ready = mmgr_infin_loculus_ready,
349 .loculus_next = mmgr_infin_loculus_next,
350 .loculus_hold = mmgr_infin_loculus_hold,
351 .loculus_keepout = mmgr_infin_loculus_keepout,
352 .loculus_drop = mmgr_infin_loculus_drop,
353 .loculus_mark = mmgr_infin_loculus_mark,
#define MMGR_RING_WORDS
Size of the ring storage a caller declares, counted in size_t units.
Arguments for every infin call; each reads only what it needs.
Type of the iteratio_infinita dispatch table.
size_t(*) read(const InfinCfg *c)
void(*) seg_publish(const InfinCfg *c)
mmgr_iword(*) loculus_next(const InfinCfg *c)
void(*) seg_release(const InfinCfg *c)
mmgr_bool(*) read_byte(const InfinCfg *c)
size_t(*) seg_inflight(const InfinCfg *c)
mmgr_bool(*) loculus_hold(const InfinCfg *c)
mmgr_bool(*) init(const InfinCfg *c)
mmgr_bool(*) seg_next(const InfinCfg *c)
void(*) consume(const InfinCfg *c)
void(*) loculus_mark(const InfinCfg *c)
mmgr_word(*) loculus_ready(const InfinCfg *c)
size_t(*) available(const InfinCfg *c)
mmgr_bool(*) seg_front(const InfinCfg *c)
mmgr_bool(*) put(const InfinCfg *c)
void(*) loculus_drop(const InfinCfg *c)
void(*) peek(const InfinCfg *c)
size_t(*) vacant(const InfinCfg *c)
Single-producer, single-consumer byte ring, a segment view over it, and loculus keepouts.
Storage a caller declares for one ring, whose contents belong to the implementation.
MMGR_ALIGN(sizeof(size_t)) uint8_t opaque[MMGR_RING_WORDS *sizeof(size_t)]
uint8_t opaque[MMGR_RING_WORDS *sizeof(size_t)]