pub const PILEUP_MAP_BYTES_PER_BASE: u64 = 16;
pub const PILEUP_SEQQUAL_BYTES_PER_BASE: u64 = 2;
pub const PILEUP_PER_READ_OVERHEAD: u64 = 64;
pub const PILEUP_ENGINE_OVERHEAD: u64 = 256;
pub const PILEUP_IO_RSS_OVERHEAD: u64 = 8 * 1024 * 1024;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct MemoryBudget {
pub bytes: u64,
}
impl MemoryBudget {
pub fn from_mb(mb: u64) -> Self {
Self {
bytes: mb.saturating_mul(1024 * 1024),
}
}
pub fn unlimited() -> Self {
Self { bytes: u64::MAX }
}
pub fn admits(self, working_set_bytes: u64) -> bool {
working_set_bytes <= self.bytes
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct WorkingSet {
pub bytes: u64,
}
impl WorkingSet {
pub fn fits(self, budget: MemoryBudget) -> bool {
budget.admits(self.bytes)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn budget_admits_within_and_rejects_beyond() {
let budget = MemoryBudget::from_mb(2);
assert!(budget.admits(1_000_000));
assert!(!budget.admits(3 * 1024 * 1024));
assert!(budget.admits(2 * 1024 * 1024)); }
#[test]
fn unlimited_admits_everything_and_working_set_checks_fit() {
assert!(MemoryBudget::unlimited().admits(u64::MAX));
let ws = WorkingSet { bytes: 512 };
assert!(ws.fits(MemoryBudget::from_mb(1)));
assert!(!WorkingSet {
bytes: 5 * 1024 * 1024
}
.fits(MemoryBudget::from_mb(1)));
}
}