use std::collections::BTreeMap;
use crate::process::{self, Process};
use crate::{Pid, Result};
#[derive(Debug, Clone)]
pub struct ProcessCollector {
pub processes: BTreeMap<Pid, Process>,
}
impl ProcessCollector {
pub fn new() -> Result<ProcessCollector> {
let processes = process::processes()?
.into_iter()
.filter_map(|process| process.ok())
.map(|process| (process.pid(), process))
.collect();
Ok(ProcessCollector { processes })
}
pub fn update(&mut self) -> Result<()> {
let new = ProcessCollector::new()?.processes;
let to_remove: Vec<Pid> = self
.processes
.iter()
.filter(|(pid, _process)| !new.contains_key(pid))
.map(|(pid, _process)| *pid)
.collect();
for id in to_remove {
self.processes.remove(&id);
}
new.into_iter().for_each(|(pid, process)| {
if !self.processes.contains_key(&pid) || self.processes[&pid] != process {
self.processes.insert(pid, process);
} else {
#[cfg(target_os = "linux")]
{
self.processes.get_mut(&pid).unwrap().procfs_stat = process.procfs_stat;
}
}
});
Ok(())
}
}