From c325eb3af90e3046ec4c9d9f85250e0e9c4d7792 Mon Sep 17 00:00:00 2001 From: pierce Date: Thu, 9 Nov 2023 16:41:01 +0800 Subject: [PATCH] fix(performance): only refresh relevant prorcess in sysinfo when serializing sessions (#2920) * optimize: update refresh prorcess for sysinfo to reduce cpu usage * fix: fix format Signed-off-by: xuanyuan300 --------- Signed-off-by: xuanyuan300 --- zellij-server/src/os_input_output.rs | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/zellij-server/src/os_input_output.rs b/zellij-server/src/os_input_output.rs index c74001ea7..8a2a4cdc7 100644 --- a/zellij-server/src/os_input_output.rs +++ b/zellij-server/src/os_input_output.rs @@ -756,20 +756,24 @@ impl ServerOsApi for ServerOsInputOutput { fn get_cwds(&self, pids: Vec) -> HashMap { let mut system_info = System::new(); - // Update by minimizing information. - // See https://docs.rs/sysinfo/0.22.5/sysinfo/struct.ProcessRefreshKind.html# - system_info.refresh_processes_specifics(ProcessRefreshKind::default()); - let mut cwds = HashMap::new(); + for pid in pids { - if let Some(process) = system_info.process(pid.into()) { - let cwd = process.cwd(); - let cwd_is_empty = cwd.iter().next().is_none(); - if !cwd_is_empty { - cwds.insert(pid, process.cwd().to_path_buf()); + // Update by minimizing information. + // See https://docs.rs/sysinfo/0.22.5/sysinfo/struct.ProcessRefreshKind.html# + let is_found = + system_info.refresh_process_specifics(pid.into(), ProcessRefreshKind::default()); + if is_found { + if let Some(process) = system_info.process(pid.into()) { + let cwd = process.cwd(); + let cwd_is_empty = cwd.iter().next().is_none(); + if !cwd_is_empty { + cwds.insert(pid, process.cwd().to_path_buf()); + } } } } + cwds } fn get_all_cmds_by_ppid(&self) -> HashMap> {