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}