use super::logger::{LogLevel, LoggerConfig};
use super::size::MemorySize;
use alloc::vec::Vec;
#[derive(Clone, Debug, serde::Serialize, serde::Deserialize, Default)]
#[serde(deny_unknown_fields)]
pub struct MemoryConfig {
#[serde(default)]
pub logger: LoggerConfig<MemoryLogLevel>,
#[serde(default)]
pub persistent_memory: PersistentMemory,
}
#[derive(Clone, Debug, PartialEq)]
pub enum MemoryPoolsConfig {
Preset(MemoryPoolsPreset),
Explicit(Vec<MemoryPoolConfig>),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum MemoryPoolsPreset {
SubSlices,
ExclusivePages,
}
#[derive(Clone, Debug, PartialEq)]
pub enum MemoryPoolConfig {
Exclusive {
max_alloc_size: MemorySize,
dealloc_period: Option<u64>,
},
Sliced {
page_size: MemorySize,
max_slice_size: Option<MemorySize>,
max_pool_size: Option<MemorySize>,
dealloc_period: Option<u64>,
},
}
#[derive(Clone, Debug, serde::Serialize, serde::Deserialize, Default)]
pub enum PersistentMemory {
#[default]
#[serde(rename = "enabled")]
Enabled,
#[serde(rename = "size-match")]
SizeMatch,
#[serde(rename = "disabled")]
Disabled,
#[serde(rename = "enforced")]
Enforced,
}
#[derive(Default, Clone, Copy, Debug, serde::Serialize, serde::Deserialize)]
pub enum MemoryLogLevel {
#[default]
#[serde(rename = "disabled")]
Disabled,
#[serde(rename = "basic")]
Basic,
#[serde(rename = "full")]
Full,
}
impl LogLevel for MemoryLogLevel {}
#[cfg(all(test, feature = "std"))]
mod tests {
use super::*;
#[test]
fn pools_rejected_in_config_files() {
assert!(toml::from_str::<MemoryConfig>("pools = \"sub-slices\"").is_err());
assert!(
toml::from_str::<MemoryConfig>("[[pools]]\ntype = \"sliced\"\npage_size = \"1MiB\"\n")
.is_err()
);
}
}