ruvector_memopt/core/
process_scorer.rs

1//! Process scoring for intelligent trimming decisions
2
3use sysinfo::System;
4use std::collections::HashMap;
5
6pub struct ProcessScorer {
7    system: System,
8    priorities: HashMap<String, u32>,
9}
10
11impl ProcessScorer {
12    pub fn new() -> Self {
13        let mut priorities = HashMap::new();
14        for proc in ["System", "csrss.exe", "smss.exe", "lsass.exe", "services.exe"] {
15            priorities.insert(proc.to_lowercase(), 0);
16        }
17        for proc in ["explorer.exe", "dwm.exe", "svchost.exe"] {
18            priorities.insert(proc.to_lowercase(), 10);
19        }
20        for proc in ["chrome.exe", "firefox.exe", "msedge.exe", "code.exe", "slack.exe"] {
21            priorities.insert(proc.to_lowercase(), 50);
22        }
23        Self { system: System::new_all(), priorities }
24    }
25
26    pub fn refresh(&mut self) {
27        self.system.refresh_processes();
28    }
29
30    pub fn get_trim_candidates(&self, limit: usize) -> Vec<u32> {
31        let mut candidates: Vec<(u32, u64, u32)> = self.system
32            .processes()
33            .iter()
34            .filter_map(|(pid, proc)| {
35                let name = proc.name().to_string().to_lowercase();
36                let priority = self.priorities.get(&name).copied().unwrap_or(30);
37                if priority == 0 { return None; }
38                Some((pid.as_u32(), proc.memory(), priority))
39            })
40            .collect();
41        candidates.sort_by(|a, b| ((b.2 as u64) * b.1).cmp(&((a.2 as u64) * a.1)));
42        candidates.into_iter().take(limit).map(|(pid, _, _)| pid).collect()
43    }
44
45    pub fn get_memory_by_name(&self, name: &str) -> u64 {
46        let name_lower = name.to_lowercase();
47        self.system.processes().values()
48            .filter(|p| p.name().to_lowercase().contains(&name_lower))
49            .map(|p| p.memory())
50            .sum()
51    }
52
53    pub fn process_count(&self) -> usize { self.system.processes().len() }
54}
55
56impl Default for ProcessScorer {
57    fn default() -> Self { Self::new() }
58}