1use mpi::Threading;
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq)]
12pub enum Error {
13 Mpi(i32),
14 Threading(Threading),
15 Intercommunicator,
16 SizeOverflow,
17 CountOverflow,
18 Rank(i32),
19 Range {
20 start: usize,
21 len: usize,
22 window: usize,
23 },
24 Window(&'static str),
25 Ring(&'static str),
26 Payload {
27 len: usize,
28 capacity: usize,
29 },
30 Ack {
31 origin: i32,
32 sequence: u64,
33 received: u64,
34 },
35 Lapped {
36 origin: i32,
37 expected: u64,
38 found: u64,
39 },
40}
41
42impl std::fmt::Display for Error {
43 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
44 match self {
45 Error::Mpi(code) => write!(f, "MPI RMA error {code}"),
46 Error::Threading(got) => {
47 write!(f, "MPI RMA requires Threading::Multiple, got {got:?}")
48 }
49 Error::Intercommunicator => write!(f, "MPI RMA requires an intracommunicator"),
50 Error::SizeOverflow => write!(f, "RMA window size does not fit MPI_Aint"),
51 Error::CountOverflow => write!(f, "RMA transfer count does not fit MPI Count"),
52 Error::Rank(rank) => write!(f, "rank {rank} is outside the window communicator"),
53 Error::Range { start, len, window } => write!(
54 f,
55 "RMA range {start}..{} exceeds window length {window}",
56 start.saturating_add(*len)
57 ),
58 Error::Window(msg) => write!(f, "invalid RMA window: {msg}"),
59 Error::Ring(msg) => write!(f, "invalid RMA ring state: {msg}"),
60 Error::Payload { len, capacity } => {
61 write!(f, "ring payload length {len} exceeds capacity {capacity}")
62 }
63 Error::Ack {
64 origin,
65 sequence,
66 received,
67 } => write!(
68 f,
69 "cannot acknowledge sequence {sequence} from rank {origin}; received through {received}"
70 ),
71 Error::Lapped {
72 origin,
73 expected,
74 found,
75 } => write!(
76 f,
77 "safe lane from rank {origin} was overwritten: expected sequence {expected}, found {found}"
78 ),
79 }
80 }
81}
82
83impl std::error::Error for Error {}