Skip to main content

memory_budget/
reservation_error.rs

1//! Typed refusal before a caller acquires allocation ownership.
2
3use std::fmt;
4
5/// An allocation reservation would exceed the aggregate lease allowance.
6///
7/// Refusal does not change accounting. Callers must refuse, spill, or retry
8/// without allocating the payload they could not reserve.
9#[derive(Clone, Copy, Debug, PartialEq, Eq)]
10pub struct ReservationError {
11    requested_bytes: u64,
12    reserved_bytes: u64,
13    capacity_bytes: u64,
14}
15
16impl ReservationError {
17    pub(crate) const fn new(requested: u64, reserved: u64, capacity: u64) -> Self {
18        Self {
19            requested_bytes: requested,
20            reserved_bytes: reserved,
21            capacity_bytes: capacity,
22        }
23    }
24
25    /// Bytes the caller attempted to reserve.
26    #[must_use]
27    pub const fn requested_bytes(self) -> u64 {
28        self.requested_bytes
29    }
30
31    /// Outstanding bytes observed when admission was refused.
32    #[must_use]
33    pub const fn reserved_bytes(self) -> u64 {
34        self.reserved_bytes
35    }
36
37    /// Maximum aggregate reservation capacity.
38    #[must_use]
39    pub const fn capacity_bytes(self) -> u64 {
40        self.capacity_bytes
41    }
42}
43
44impl fmt::Display for ReservationError {
45    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
46        write!(
47            formatter,
48            "memory reservation refused: requested {} bytes with {} of {} bytes reserved",
49            self.requested_bytes, self.reserved_bytes, self.capacity_bytes,
50        )
51    }
52}
53
54impl std::error::Error for ReservationError {}