Skip to main content

mpi_rma/
error.rs

1//! Error types for the RMA layer and the fixed-slot ring transport.
2//!
3//! - `Mpi`, `Threading`: environment conditions (returned by the MPI
4//!   error handler or the threading check).
5//! - `Intercommunicator`, `SizeOverflow`, `CountOverflow`, `Rank`, `Range`,
6//!   `Window`: window API failures.
7//! - `Ring`, `Payload`, `Ack`, `Lapped`: ring transport failures.
8
9use 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 {}