indexbus_abi/layouts/
common.rs

1use crate::{
2    IndexbusAtomicU32, IndexbusAtomicU64, INDEXBUS_QUEUE_CAPACITY, INDEXBUS_SLOTS_CAPACITY,
3    INDEXBUS_SLOT_DATA_SIZE,
4};
5
6#[repr(C)]
7/// Fixed-size message slot.
8///
9/// Slots are reference-counted and stored in shared memory; queues hold slot indices.
10pub struct Slot {
11    /// Next slot in the free list (slot index), or [`crate::INDEXBUS_EMPTY_FREE_U32`].
12    pub next_free: IndexbusAtomicU32,
13    /// Reference count for shared ownership across queues/consumers.
14    pub refcnt: IndexbusAtomicU32,
15
16    /// Payload length in bytes.
17    pub len: u32,
18    /// Padding (reserved).
19    pub pad: u32,
20
21    /// Payload storage.
22    pub data: [u8; INDEXBUS_SLOT_DATA_SIZE],
23}
24
25#[allow(dead_code)]
26const _SLOT_SIZE_CHECK: [u8; 4 + 4 + 4 + 4 + INDEXBUS_SLOT_DATA_SIZE] =
27    [0u8; core::mem::size_of::<Slot>()];
28
29#[repr(C, align(64))]
30/// Pool of fixed-size slots used by shared-memory queues.
31pub struct SlotPoolLayout {
32    /// Head of the free list (slot index), or [`crate::INDEXBUS_EMPTY_FREE_U32`].
33    pub free_head: IndexbusAtomicU32,
34    /// Fixed-capacity slot storage.
35    pub slots: [Slot; INDEXBUS_SLOTS_CAPACITY],
36}
37
38#[repr(C, align(64))]
39/// Single-producer/single-consumer index queue.
40pub struct IndexQueue {
41    /// Producer cursor.
42    pub head: IndexbusAtomicU64,
43    /// Consumer cursor.
44    pub tail: IndexbusAtomicU64,
45    /// Ring buffer of slot indices.
46    pub buf: [u32; INDEXBUS_QUEUE_CAPACITY],
47}
48
49#[repr(C, align(64))]
50/// Multi-producer/single-consumer queue using per-slot sequence numbers.
51pub struct MpscQueue {
52    /// Producer reservation cursor.
53    pub write: IndexbusAtomicU64,
54    /// Padding to keep counters in separate cache lines.
55    pub pad0: [u8; 56],
56
57    /// Consumer cursor (single consumer).
58    pub read: IndexbusAtomicU64,
59    /// Padding to keep counters in separate cache lines.
60    pub pad1: [u8; 56],
61
62    /// Per-slot sequence numbers.
63    pub seq: [IndexbusAtomicU64; INDEXBUS_QUEUE_CAPACITY],
64    /// Per-slot stored values (slot indices).
65    pub buf: [u32; INDEXBUS_QUEUE_CAPACITY],
66}