remove Arc
This commit is contained in:
parent
f7efe0f420
commit
f0ca662d0c
99
src/main.rs
99
src/main.rs
|
@ -2,7 +2,6 @@ use std::fs::File;
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
use std::os::fd::AsRawFd;
|
use std::os::fd::AsRawFd;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::sync::Arc;
|
|
||||||
|
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use miette::{IntoDiagnostic, Result};
|
use miette::{IntoDiagnostic, Result};
|
||||||
|
@ -67,70 +66,72 @@ fn main() -> Result<()> {
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut file = File::open(args.file).into_diagnostic()?;
|
let mut file = File::open(args.file).into_diagnostic()?;
|
||||||
let strings = Arc::new(lib::get_strings(&mut file, args.min_str_len).into_diagnostic()?);
|
let strings = lib::get_strings(&mut file, args.min_str_len).into_diagnostic()?;
|
||||||
eprintln!("Found {} strings", strings.len());
|
eprintln!("Found {} strings", strings.len());
|
||||||
let pointers = Arc::new(lib::get_pointers(&mut file, args.big_endian).into_diagnostic()?);
|
let pointers = lib::get_pointers(&mut file, args.big_endian).into_diagnostic()?;
|
||||||
eprintln!("Found {} pointers", pointers.len());
|
eprintln!("Found {} pointers", pointers.len());
|
||||||
|
|
||||||
let start = 0x0000_0000u64;
|
let start = 0x0000_0000u64;
|
||||||
let end = 0x1_0000_0000u64;
|
let end = 0x1_0000_0000u64;
|
||||||
let total_pages = ((end - start) / (args.page_size as u64)) as usize;
|
let total_pages = ((end - start) / (args.page_size as u64)) as usize;
|
||||||
let chunk_size = (end - start) / (args.threads as u64);
|
let chunk_size = (end - start) / (args.threads as u64);
|
||||||
let ranges = (start..=end)
|
|
||||||
.step_by(chunk_size as usize)
|
|
||||||
.zip((start + chunk_size..=end).step_by(chunk_size as usize));
|
|
||||||
|
|
||||||
let tasks: Vec<_> = ranges
|
let progress_counters: Vec<_> =
|
||||||
.map(|(start, end)| {
|
(0..args.threads).map(|_| lib::ComputeProgress::new()).collect();
|
||||||
let progress = Arc::new(lib::ComputeProgress::new());
|
|
||||||
|
|
||||||
let strings = Arc::clone(&strings);
|
let mut thread_results = std::thread::scope(|s| {
|
||||||
let pointers = Arc::clone(&pointers);
|
let ranges = (start..=end)
|
||||||
let child_progress = Arc::clone(&progress);
|
.step_by(chunk_size as usize)
|
||||||
|
.zip((start + chunk_size..=end).step_by(chunk_size as usize));
|
||||||
|
|
||||||
let thread = std::thread::spawn(move || {
|
let tasks: Vec<_> = ranges.zip(progress_counters.iter())
|
||||||
lib::compute_matches(
|
.map(|((start, end), counter)| {
|
||||||
&strings,
|
let strings = &strings;
|
||||||
&pointers,
|
let pointers = &pointers;
|
||||||
start,
|
s.spawn(move || {
|
||||||
end,
|
lib::compute_matches(
|
||||||
args.page_size,
|
strings,
|
||||||
Some(&child_progress),
|
pointers,
|
||||||
)
|
start,
|
||||||
});
|
end,
|
||||||
|
args.page_size,
|
||||||
|
Some(counter),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
(thread, progress)
|
if let Some(mut term) = term {
|
||||||
})
|
loop {
|
||||||
.collect();
|
std::thread::sleep(std::time::Duration::from_millis(100));
|
||||||
|
if tasks.iter().any(|thread| !thread.is_finished()) {
|
||||||
|
term.carriage_return().unwrap();
|
||||||
|
term.delete_line().unwrap();
|
||||||
|
|
||||||
if let Some(mut term) = term {
|
let completed_pages: usize =
|
||||||
loop {
|
progress_counters.iter().map(|prg| prg.num_completed()).sum();
|
||||||
std::thread::sleep(std::time::Duration::from_millis(100));
|
|
||||||
if tasks.iter().any(|(thread, _)| !thread.is_finished()) {
|
|
||||||
term.carriage_return().unwrap();
|
|
||||||
term.delete_line().unwrap();
|
|
||||||
|
|
||||||
let completed_pages: usize = tasks.iter().map(|(_, prg)| prg.num_completed()).sum();
|
eprint!("{} / {} ({}%)", completed_pages, total_pages,
|
||||||
|
completed_pages * 100 / total_pages);
|
||||||
eprint!("{} / {} ({}%)", completed_pages, total_pages,
|
std::io::stderr().flush().unwrap();
|
||||||
completed_pages * 100 / total_pages);
|
} else {
|
||||||
std::io::stderr().flush().unwrap();
|
break;
|
||||||
} else {
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
term.carriage_return().unwrap();
|
||||||
|
term.delete_line().unwrap();
|
||||||
|
eprintln!("Scan complete");
|
||||||
|
} else {
|
||||||
|
eprintln!("Scanning...");
|
||||||
}
|
}
|
||||||
|
|
||||||
term.carriage_return().unwrap();
|
let thread_results: Vec<_> = tasks
|
||||||
term.delete_line().unwrap();
|
.into_iter()
|
||||||
eprintln!("Scan complete");
|
.map(|thread| thread.join().map_err(std::panic::resume_unwind).unwrap())
|
||||||
} else {
|
.collect::<Vec<_>>();
|
||||||
eprintln!("Scanning...");
|
thread_results
|
||||||
}
|
});
|
||||||
|
|
||||||
let mut thread_results: Vec<_> = tasks
|
|
||||||
.into_iter()
|
|
||||||
.map(|(thread, _)| thread.join().map_err(std::panic::resume_unwind).unwrap())
|
|
||||||
.collect::<Vec<_>>();
|
|
||||||
|
|
||||||
eprintln!("Results:");
|
eprintln!("Results:");
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue