refactor: getting rid of crossbeam

This commit is contained in:
alexpasmantier 2024-10-04 13:39:43 +02:00
parent 5e45659599
commit 662f2d7735
3 changed files with 32 additions and 63 deletions

32
Cargo.lock generated
View File

@ -129,28 +129,6 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422"
[[package]]
name = "crossbeam"
version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8"
dependencies = [
"crossbeam-channel",
"crossbeam-deque",
"crossbeam-epoch",
"crossbeam-queue",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-channel"
version = "0.5.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2"
dependencies = [
"crossbeam-utils",
]
[[package]]
name = "crossbeam-deque"
version = "0.8.5"
@ -170,15 +148,6 @@ dependencies = [
"crossbeam-utils",
]
[[package]]
name = "crossbeam-queue"
version = "0.3.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35"
dependencies = [
"crossbeam-utils",
]
[[package]]
name = "crossbeam-utils"
version = "0.8.20"
@ -301,7 +270,6 @@ version = "0.3.0"
dependencies = [
"anyhow",
"clap",
"crossbeam",
"grep",
"ignore",
"serde",

View File

@ -20,7 +20,6 @@ categories = [
[dependencies]
anyhow = "1.0.86"
clap = { version = "4.5.9", features = ["derive"] }
crossbeam = { version = "0.8.4", features = ["crossbeam-queue"] }
grep = "0.3.1"
ignore = "0.4.22"
serde = { version = "1.0.204", features = ["derive"] }

View File

@ -1,11 +1,10 @@
use std::io::{stdin, Read};
use std::path::PathBuf;
use std::sync::Arc;
use std::sync::{mpsc, Arc};
use clap::Parser;
use cli::Commands;
use crossbeam::queue::SegQueue;
use fs::is_readable_stdin;
use grep::regex::RegexMatcher;
use ignore::DirEntry;
@ -67,8 +66,6 @@ pub fn main() -> anyhow::Result<()> {
}
}
let queue: Arc<SegQueue<FileResults>> = Arc::new(SegQueue::new());
let haystack_builder = walk_builder(
cli_args.paths.iter().map(|p| p.as_path()).collect(),
&cli_args.ignored_paths,
@ -77,31 +74,36 @@ pub fn main() -> anyhow::Result<()> {
cli_args.filter_filetypes,
);
let matcher: Arc<RegexMatcher> = Arc::new(build_matcher(&cli_args.patterns)?);
haystack_builder.build_parallel().run(|| {
let matcher = Arc::clone(&matcher);
let mut searcher = build_searcher(cli_args.multiline);
let queue = Arc::clone(&queue);
Box::new(move |entry: Result<DirEntry, ignore::Error>| match entry {
Ok(entry) => {
let file_type = entry.file_type().unwrap();
if !file_type.is_dir() {
let path = entry.path().to_path_buf();
match search_file(path, &matcher, &mut searcher) {
Ok(file_results) => {
if !file_results.is_empty() {
queue.push(file_results);
let (tx, printer_queue) = mpsc::channel();
std::thread::spawn(move || {
haystack_builder.build_parallel().run(|| {
let matcher = Arc::clone(&matcher);
let mut searcher = build_searcher(cli_args.multiline);
let tx = tx.clone();
Box::new(move |entry: Result<DirEntry, ignore::Error>| match entry {
Ok(entry) => {
let file_type = entry.file_type().unwrap();
if !file_type.is_dir() {
let path = entry.path().to_path_buf();
match search_file(path, &matcher, &mut searcher) {
Ok(file_results) => {
if !file_results.is_empty() {
tx.send(file_results).unwrap();
}
}
Err(_err) => (),
}
Err(_err) => (),
}
ignore::WalkState::Continue
}
ignore::WalkState::Continue
}
Err(err) => {
eprintln!("Error: {}", err);
ignore::WalkState::Continue
}
})
Err(err) => {
eprintln!("Error: {}", err);
ignore::WalkState::Continue
}
})
});
});
let printer_config = PrinterConfig {
@ -112,12 +114,12 @@ pub fn main() -> anyhow::Result<()> {
..Default::default()
};
let mut printer = ResultsPrinter::new(printer_config);
let printer_queue = Arc::into_inner(queue).unwrap();
while !printer_queue.is_empty() {
let file_results = printer_queue.pop().unwrap();
printer.write(file_results)?;
while let Ok(result) = printer_queue.recv() {
printer.write(result)?;
printer.print()?;
}
printer.print()?;
//printer.print()?;
Ok(())
}