dope_runtime/process/failure/
bus.rs1use std::mem;
2
3pub use dope_core::dope_sys::io::socket::record::Error as Create;
4use dope_core::platform::affinity;
5
6#[derive(Clone, Copy, Debug, PartialEq, Eq)]
7#[repr(u8)]
8pub enum Event {
9 Installed,
10 Ready,
11 Drain,
12 Done,
13 Failed,
14}
15
16#[derive(Clone, Copy, Debug, PartialEq, Eq)]
17#[repr(transparent)]
18pub struct Invalid(u8);
19
20#[derive(Clone, Copy, Debug, PartialEq, Eq)]
21pub struct RecordSize {
22 pub expected: usize,
23 pub actual: usize,
24}
25
26#[derive(Debug)]
27pub struct Startup {
28 pub cpu: affinity::Cpu,
29 pub event: Event,
30 pub workers: usize,
31 pub installed: usize,
32 pub ready: usize,
33 pub gated: bool,
34}
35
36#[derive(Debug)]
37pub struct Drain {
38 pub cause: DrainCause,
39 pub workers: usize,
40 pub drained: usize,
41 pub done: usize,
42}
43
44#[derive(Debug)]
45pub enum DrainCause {
46 Event { cpu: affinity::Cpu, event: Event },
47 Order,
48}
49
50#[derive(Debug)]
51pub struct Shutdown {
52 pub cpu: affinity::Cpu,
53 pub event: Event,
54 pub workers: usize,
55 pub done: usize,
56}
57
58impl Event {
59 pub(in crate::process) const fn encode(self) -> u8 {
60 self as u8
61 }
62
63 pub(in crate::process) const fn decode(value: u8) -> Result<Self, Invalid> {
64 match value {
65 0 => Ok(Self::Installed),
66 1 => Ok(Self::Ready),
67 2 => Ok(Self::Drain),
68 3 => Ok(Self::Done),
69 4 => Ok(Self::Failed),
70 value => Err(Invalid(value)),
71 }
72 }
73}
74
75#[derive(Clone, Copy, Debug, PartialEq, Eq)]
76pub enum Write {
77 Syscall(dope_core::Errno),
78 Record(RecordSize),
79 Shutdown(dope_core::Errno),
80}
81
82#[derive(Clone, Copy, Debug, PartialEq, Eq)]
83pub struct Fault {
84 pub event: Event,
85 pub failure: Write,
86 pub shutdown: Option<dope_core::Errno>,
87}
88
89#[derive(Debug)]
90pub enum Report {
91 Clean,
92 Failed(Fault),
93}
94
95#[derive(Debug)]
96pub struct Sequence {
97 pub gated: bool,
98 pub previous: Option<Event>,
99 pub event: Event,
100}
101
102#[derive(Debug)]
103pub enum Read {
104 Syscall(dope_core::Errno),
105 Stopped(dope_core::Errno),
107 Closed,
108 Event(Invalid),
109 Sequence(Sequence),
110}
111
112#[derive(Debug)]
113pub enum State {
114 StartupEvent(Startup),
115 RuntimeEvent { cpu: affinity::Cpu, event: Event },
116 DrainEvent(Drain),
117 DrainOrder(Drain),
118 ShutdownEvent(Shutdown),
119}
120
121const _: () = {
122 assert!(mem::size_of::<Event>() == mem::size_of::<u8>());
123 assert!(mem::size_of::<Invalid>() == mem::size_of::<u8>());
124};