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}