use std::collections::{HashMap, HashSet};
use std::sync::Arc;
use std::time::{Duration, Instant};
use crate::cgroup::CgroupMem;
use crate::procfs::{MemInfo, Pressure, SmapsReport};
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub enum SortKey {
Rss,
Pss,
Uss,
Delta,
Ratio,
Pid,
Comm,
}
impl SortKey {
pub const ALL: [SortKey; 7] = [
SortKey::Rss,
SortKey::Pss,
SortKey::Uss,
SortKey::Delta,
SortKey::Ratio,
SortKey::Pid,
SortKey::Comm,
];
pub fn label(self) -> &'static str {
match self {
SortKey::Rss => "RSS",
SortKey::Pss => "PSS",
SortKey::Uss => "USS",
SortKey::Delta => "DELTA",
SortKey::Ratio => "PSS/RSS",
SortKey::Pid => "PID",
SortKey::Comm => "COMM",
}
}
pub fn next(self) -> SortKey {
let i = Self::ALL.iter().position(|k| *k == self).unwrap_or(0);
Self::ALL[(i + 1) % Self::ALL.len()]
}
}
#[derive(Clone, Debug)]
pub struct ProcRow {
pub pid: u32,
pub comm: String,
pub rss_kb: u64,
pub delta_kb: i64,
}
#[derive(Clone, Copy, Debug)]
pub struct PssInfo {
pub rollup: crate::procfs::Rollup,
pub at: Instant,
}
#[derive(Clone, Debug)]
pub struct Detail {
pub pid: u32,
pub comm: String,
pub cmdline: String,
pub report: SmapsReport,
pub rollup: crate::procfs::Rollup,
pub parse_ms: f32,
pub at: Instant,
}
#[derive(Clone, Debug)]
pub struct Snapshot {
pub rows: Vec<ProcRow>,
pub pss: HashMap<u32, PssInfo>,
pub mem: MemInfo,
pub pressure: Pressure,
pub scan_seq: u64,
pub cgroups: Vec<CgroupMem>,
pub pid_cgroup: Arc<HashMap<u32, String>>,
pub pid_exe: Arc<HashMap<u32, String>>,
pub detail: Option<Detail>,
pub detail_error: Option<String>,
pub sweep_ms: f32,
pub pss_ms: f32,
pub covered_pss_kb: u64,
pub covered: usize,
pub denied: HashSet<u32>,
pub no_mm: HashSet<u32>,
pub at: Instant,
}
#[derive(Clone, Copy, Debug)]
pub enum Focus {
Set { pid: Option<u32>, want_detail: bool },
}
pub const PSS_MAX_AGE: Duration = Duration::from_millis(6000);
pub const PSS_DENIED_TTL: Duration = Duration::from_secs(30);
pub const PSS_REFRESH_AFTER: Duration = Duration::from_millis(2000);