diff --git a/Cargo.lock b/Cargo.lock index 3e98541..6f9edb5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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", diff --git a/Cargo.toml b/Cargo.toml index dbca99d..76b25fb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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"] } diff --git a/src/main.rs b/src/main.rs index 34359be..8eacb6c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -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> = 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 = 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| 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| 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(()) }