feat: running modules in another thread

This commit is contained in:
iff 2025-01-03 15:58:07 +01:00
parent 46c1aa62ce
commit c93f5b5cf5
2 changed files with 37 additions and 18 deletions

View file

@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] ## [Unreleased]
### Changed
- Running standard modules in a separated thread
## [0.6.8] - 2025-01-02 ## [0.6.8] - 2025-01-02
### Fixed ### Fixed
@ -127,7 +131,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
History start. History start.
[unreleased]: https://github.com/iffse/pay-respects/compare/v0.6.8..HEAD [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.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.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 [0.6.5]: https://github.com/iffse/pay-respects/compare/v0.6.4..v0.6.5

View file

@ -1,5 +1,6 @@
use std::io::stderr; use std::io::stderr;
use std::process::{exit, Stdio}; use std::process::{exit, Stdio};
use std::thread;
use std::time::{Duration, Instant}; use std::time::{Duration, Instant};
use colored::Colorize; use colored::Colorize;
@ -17,6 +18,8 @@ pub fn suggest_candidates(data: &mut Data) {
let command = &data.command; let command = &data.command;
let privilege = &data.privilege; let privilege = &data.privilege;
let mut suggest_candidates = vec![]; let mut suggest_candidates = vec![];
let mut module_candidates = vec![];
let mut final_candidates = vec![];
let modules = &data.modules; let modules = &data.modules;
let fallbacks = &data.fallbacks; let fallbacks = &data.fallbacks;
@ -27,13 +30,17 @@ pub fn suggest_candidates(data: &mut Data) {
eprintln!("fallbacks: {fallbacks:?}"); eprintln!("fallbacks: {fallbacks:?}");
} }
thread::scope(|s| {
s.spawn(|| {
let command = &data.command;
for module in modules { for module in modules {
let new_candidates = module_output(data, module); 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 suggest_candidates, &candidates); add_candidates_no_dup(command, &mut module_candidates, &candidates);
} }
} }
});
if privilege.is_none() { if privilege.is_none() {
if let Some(candidates) = match_pattern("_PR_privilege", data) { if let Some(candidates) = match_pattern("_PR_privilege", data) {
@ -46,16 +53,24 @@ pub fn suggest_candidates(data: &mut Data) {
if let Some(candidates) = match_pattern("_PR_general", data) { if let Some(candidates) = match_pattern("_PR_general", data) {
add_candidates_no_dup(command, &mut suggest_candidates, &candidates); 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() { 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; return;
} }
for fallback in fallbacks { for fallback in fallbacks {
let candidates = module_output(data, fallback); let candidates = module_output(data, fallback);
if candidates.is_some() { if candidates.is_some() {
add_candidates_no_dup(command, &mut suggest_candidates, &candidates.unwrap()); add_candidates_no_dup(command, &mut final_candidates, &candidates.unwrap());
data.candidates = suggest_candidates; data.candidates = final_candidates;
return; return;
} }
} }