indexbus_abi/layouts/
fanout.rs

1use crate::{caps, IndexbusAtomicU32, LayoutHeader};
2
3use super::common::{IndexQueue, MpscQueue, SlotPoolLayout};
4
5/// Fanout events region base layout (generic over consumer count).
6///
7/// Note: C header generation typically uses a concrete `N` (see `SharedFanoutLayout4`).
8#[repr(C, align(64))]
9pub struct SharedFanoutLayout<const N: usize> {
10    /// Common region header (magic/version/capabilities/layout size).
11    pub header: LayoutHeader,
12
13    /// 0 = uninitialized, 1 = initializing, 2 = initialized
14    pub initialized: IndexbusAtomicU32,
15    /// Padding (reserved).
16    pub pad0: u32,
17
18    /// Pad to 64 so `SlotPoolLayout` (align 64) starts at offset 64.
19    pub pad_to_64: [u8; 40],
20
21    /// Slot pool backing all queues.
22    pub slot_pool: SlotPoolLayout,
23
24    /// SPSC producer queue of slot indices.
25    pub producer_queue: IndexQueue,
26    /// MPSC producer queue of slot indices.
27    pub producer_queue_mpsc: MpscQueue,
28
29    /// Router round-robin cursor used by work-queue routing.
30    pub router_rr: IndexbusAtomicU32,
31    /// Padding (reserved).
32    pub pad_router_rr: u32,
33
34    /// Per-consumer SPSC queues.
35    pub consumer_queues: [IndexQueue; N],
36}
37
38impl<const N: usize> SharedFanoutLayout<N> {
39    /// Capabilities required for this region to be considered compatible.
40    pub const REQUIRED_CAPS: u32 =
41        caps::INDEXBUS_CAP_SUPPORTS_EVENTS | caps::INDEXBUS_CAP_SUPPORTS_FANOUT;
42}
43
44/// Concrete v1 fanout layout for `N=4` (header generation target).
45#[repr(C, align(64))]
46pub struct SharedFanoutLayout4 {
47    /// Common region header (magic/version/capabilities/layout size).
48    pub header: LayoutHeader,
49
50    /// 0 = uninitialized, 1 = initializing, 2 = initialized
51    pub initialized: IndexbusAtomicU32,
52    /// Padding (reserved).
53    pub pad0: u32,
54    /// Pad to 64 so `SlotPoolLayout` (align 64) starts at offset 64.
55    pub pad_to_64: [u8; 40],
56
57    /// Slot pool backing all queues.
58    pub slot_pool: SlotPoolLayout,
59
60    /// SPSC producer queue of slot indices.
61    pub producer_queue: IndexQueue,
62    /// MPSC producer queue of slot indices.
63    pub producer_queue_mpsc: MpscQueue,
64
65    /// Router round-robin cursor used by work-queue routing.
66    pub router_rr: IndexbusAtomicU32,
67    /// Padding (reserved).
68    pub pad_router_rr: u32,
69
70    /// Per-consumer SPSC queues.
71    pub consumer_queues: [IndexQueue; 4],
72}