ruvector_memopt/core/
process_scorer.rs1use 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}