hawdb_core/cancellation/
memory.rs1use super::*;
16
17pub trait RuntimeMemoryPermit: std::fmt::Debug + Send + Sync {
20 fn bytes(&self) -> u64;
21
22 fn merge(
26 &mut self,
27 incoming: Box<dyn RuntimeMemoryPermit>,
28 ) -> Result<(), Box<dyn RuntimeMemoryPermit>> {
29 Err(incoming)
30 }
31
32 #[doc(hidden)]
34 fn as_any_mut(&mut self) -> Option<&mut dyn std::any::Any> {
35 None
36 }
37}
38
39pub trait RuntimeMemoryController: std::fmt::Debug + Send + Sync {
42 fn reserve(
43 &self,
44 bytes: u64,
45 ceiling: u64,
46 ) -> Result<Box<dyn RuntimeMemoryPermit>, RuntimeMemoryError>;
47}
48
49#[derive(Debug, Clone, Copy, PartialEq, Eq)]
50pub enum RuntimeMemoryError {
51 Stopped(RuntimeCancellationReason),
52 ReservationExceeded {
53 requested_bytes: u64,
54 available_bytes: u64,
55 },
56 AdmissionDenied {
59 requested_bytes: u64,
60 available_bytes: u64,
61 retryable: bool,
62 },
63 Closed,
64 Pressure,
65}
66
67impl Display for RuntimeMemoryError {
68 fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
69 match self {
70 Self::Stopped(reason) => Display::fmt(reason, formatter),
71 Self::ReservationExceeded { requested_bytes, available_bytes } => write!(formatter,
72 "runtime memory allocation requested {requested_bytes} bytes, exceeding the {available_bytes}-byte remaining reservation"),
73 Self::AdmissionDenied { requested_bytes, available_bytes, retryable } => write!(formatter,
74 "runtime memory allocation admission denied: requested {requested_bytes} bytes, available {available_bytes} bytes, retryable {retryable}"),
75 Self::Closed => formatter.write_str("runtime memory reservation is closed"),
76 Self::Pressure => formatter.write_str("background memory pressure defers allocation"),
77 }
78 }
79}
80
81impl Error for RuntimeMemoryError {
82 fn source(&self) -> Option<&(dyn Error + 'static)> {
83 match self {
84 Self::Stopped(reason) => Some(reason),
85 _ => None,
86 }
87 }
88}