use alloc::string::String;
use alloc::vec::Vec;
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum MemoryPoolLayout {
Sliced(Vec<SlicedPool>),
Direct,
SubSlices,
ExclusivePages,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct SlicedPool {
pub page_size: u64,
pub pages: Option<u64>,
pub max_slice: Option<u64>,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct SlicedPoolReport {
pub page_size: u64,
pub pages: u64,
pub pages_peak: u64,
pub largest_alloc: u64,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct MemoryPoolUsage {
pub number_allocs: u64,
pub bytes_in_use: u64,
pub bytes_padding: u64,
pub bytes_reserved: u64,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum InstallMemoryPoolsError {
PoolsInUse {
bytes_in_use: u64,
},
StreamUnavailable,
Unsupported,
InvalidLayout {
reason: String,
},
}
impl core::fmt::Display for InstallMemoryPoolsError {
fn fmt(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
Self::PoolsInUse { bytes_in_use } => {
write!(formatter, "{bytes_in_use} B still live in the pools")
}
Self::StreamUnavailable => {
write!(formatter, "the calling stream is in an error state")
}
Self::Unsupported => {
write!(formatter, "this backend has no configurable memory pools")
}
Self::InvalidLayout { reason } => {
write!(formatter, "the pool layout cannot be honoured: {reason}")
}
}
}
}
impl core::error::Error for InstallMemoryPoolsError {}