use std::{collections::BTreeMap, vec::Vec};
use nohash::IntMap;
use crate::collection::processes::{Pid, ProcessHarvest};
#[derive(Clone, Debug, Default)]
pub struct ProcessData {
pub process_harvest: BTreeMap<Pid, ProcessHarvest>,
pub process_parent_mapping: IntMap<Pid, Vec<Pid>>,
pub orphan_pids: Vec<Pid>,
}
impl ProcessData {
pub(super) fn ingest(&mut self, list_of_processes: Vec<ProcessHarvest>) {
self.process_parent_mapping.clear();
list_of_processes.iter().rev().for_each(|process_harvest| {
if let Some(parent_pid) = process_harvest.parent_pid {
if let Some(entry) = self.process_parent_mapping.get_mut(&parent_pid) {
entry.push(process_harvest.pid);
} else {
self.process_parent_mapping
.insert(parent_pid, vec![process_harvest.pid]);
}
}
});
self.process_parent_mapping.shrink_to_fit();
let process_pid_map = list_of_processes
.into_iter()
.map(|process| (process.pid, process))
.collect();
self.process_harvest = process_pid_map;
self.orphan_pids = self
.process_harvest
.iter()
.filter_map(|(pid, process_harvest)| match process_harvest.parent_pid {
Some(parent_pid) if self.process_harvest.contains_key(&parent_pid) => None,
_ => Some(*pid),
})
.collect();
}
}