use std::collections::{HashMap, HashSet};
use std::path::Path;
use super::collect_intel_gpu_processes;
pub fn build_intel_process_infos(
intel_drm_basenames: &HashMap<String, usize>,
card_uuids: &HashMap<usize, String>,
proc_root: &Path,
) -> Vec<crate::device::types::ProcessInfo> {
use crate::utils::with_global_system;
use sysinfo::{ProcessRefreshKind, ProcessesToUpdate, UpdateKind};
let usages = collect_intel_gpu_processes(intel_drm_basenames, proc_root);
if usages.is_empty() {
return Vec::new();
}
let gpu_pids: HashSet<u32> = usages.iter().map(|u| u.pid).collect();
let system_processes = with_global_system(|system| {
let refresh_kind = ProcessRefreshKind::nothing()
.with_cpu()
.with_memory()
.with_user(UpdateKind::OnlyIfNotSet);
system.refresh_processes_specifics(ProcessesToUpdate::All, true, refresh_kind);
crate::device::process_list::get_all_processes(system, &gpu_pids)
});
let process_map: HashMap<u32, _> = system_processes.iter().map(|p| (p.pid, p)).collect();
let mut out = Vec::with_capacity(usages.len());
for usage in usages {
let uuid = card_uuids
.get(&usage.card_index)
.cloned()
.unwrap_or_default();
let sys_proc = process_map.get(&usage.pid);
out.push(crate::device::types::ProcessInfo {
device_id: usage.card_index,
device_uuid: uuid,
pid: usage.pid,
process_name: sys_proc.map(|p| p.process_name.clone()).unwrap_or_default(),
used_memory: usage.used_memory_bytes,
cpu_percent: sys_proc.map(|p| p.cpu_percent).unwrap_or(0.0),
memory_percent: sys_proc.map(|p| p.memory_percent).unwrap_or(0.0),
memory_rss: sys_proc.map(|p| p.memory_rss).unwrap_or(0),
memory_vms: sys_proc.map(|p| p.memory_vms).unwrap_or(0),
user: sys_proc.map(|p| p.user.clone()).unwrap_or_default(),
state: sys_proc.map(|p| p.state.clone()).unwrap_or_default(),
start_time: sys_proc.map(|p| p.start_time.clone()).unwrap_or_default(),
cpu_time: sys_proc.map(|p| p.cpu_time).unwrap_or(0),
command: sys_proc.map(|p| p.command.clone()).unwrap_or_default(),
ppid: sys_proc.map(|p| p.ppid).unwrap_or(0),
threads: sys_proc.map(|p| p.threads).unwrap_or(0),
uses_gpu: true,
priority: sys_proc.map(|p| p.priority).unwrap_or(0),
nice_value: sys_proc.map(|p| p.nice_value).unwrap_or(0),
gpu_utilization: 0.0,
});
}
out
}