From c93f5b5cf50977bc9151f087a891dec15455ddc9 Mon Sep 17 00:00:00 2001 From: iff Date: Fri, 3 Jan 2025 15:58:07 +0100 Subject: [PATCH] feat: running modules in another thread --- CHANGELOG.md | 6 ++++- core/src/suggestions.rs | 49 +++++++++++++++++++++++++++-------------- 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f58d352..6303c44 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +- Running standard modules in a separated thread + ## [0.6.8] - 2025-01-02 ### Fixed @@ -127,7 +131,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 History start. [unreleased]: https://github.com/iffse/pay-respects/compare/v0.6.8..HEAD -[0.6.8]: https://github.com/iffse/pay-respects/compare/v0.6.8..HEAD +[0.6.8]: https://github.com/iffse/pay-respects/compare/v0.6.7..HEAD [0.6.7]: https://github.com/iffse/pay-respects/compare/v0.6.6..v0.6.7 [0.6.6]: https://github.com/iffse/pay-respects/compare/v0.6.5..v0.6.6 [0.6.5]: https://github.com/iffse/pay-respects/compare/v0.6.4..v0.6.5 diff --git a/core/src/suggestions.rs b/core/src/suggestions.rs index 62ccac5..ff813ad 100644 --- a/core/src/suggestions.rs +++ b/core/src/suggestions.rs @@ -1,5 +1,6 @@ use std::io::stderr; use std::process::{exit, Stdio}; +use std::thread; use std::time::{Duration, Instant}; use colored::Colorize; @@ -17,6 +18,8 @@ pub fn suggest_candidates(data: &mut Data) { let command = &data.command; let privilege = &data.privilege; let mut suggest_candidates = vec![]; + let mut module_candidates = vec![]; + let mut final_candidates = vec![]; let modules = &data.modules; let fallbacks = &data.fallbacks; @@ -27,35 +30,47 @@ pub fn suggest_candidates(data: &mut Data) { eprintln!("fallbacks: {fallbacks:?}"); } - for module in modules { - let new_candidates = module_output(data, module); + thread::scope(|s| { + s.spawn(|| { + let command = &data.command; + for module in modules { + let new_candidates = module_output(&data, module); - if let Some(candidates) = new_candidates { + if let Some(candidates) = new_candidates { + add_candidates_no_dup(command, &mut module_candidates, &candidates); + } + } + }); + + if privilege.is_none() { + if let Some(candidates) = match_pattern("_PR_privilege", data) { + add_candidates_no_dup(command, &mut suggest_candidates, &candidates); + } + } + if let Some(candidates) = match_pattern(executable, data) { add_candidates_no_dup(command, &mut suggest_candidates, &candidates); } - } - - if privilege.is_none() { - if let Some(candidates) = match_pattern("_PR_privilege", data) { + if let Some(candidates) = match_pattern("_PR_general", data) { add_candidates_no_dup(command, &mut suggest_candidates, &candidates); } - } - if let Some(candidates) = match_pattern(executable, data) { - add_candidates_no_dup(command, &mut suggest_candidates, &candidates); - } - if let Some(candidates) = match_pattern("_PR_general", data) { - add_candidates_no_dup(command, &mut suggest_candidates, &candidates); - } + }); + if !module_candidates.is_empty() { + add_candidates_no_dup(command, &mut final_candidates, &module_candidates); + } if !suggest_candidates.is_empty() { - data.candidates = suggest_candidates; + add_candidates_no_dup(command, &mut final_candidates, &suggest_candidates); + } + + if !final_candidates.is_empty() { + data.candidates = final_candidates; return; } for fallback in fallbacks { let candidates = module_output(data, fallback); if candidates.is_some() { - add_candidates_no_dup(command, &mut suggest_candidates, &candidates.unwrap()); - data.candidates = suggest_candidates; + add_candidates_no_dup(command, &mut final_candidates, &candidates.unwrap()); + data.candidates = final_candidates; return; } }