mirror of
https://github.com/BurntSushi/ripgrep.git
synced 2025-05-19 09:40:22 -07:00
core: simplify parallel walking using borrows
This changes ripgrep to use ignore's new support for borrowing data when walking in parallel.
This commit is contained in:
parent
9f7c2ebc09
commit
578e2d47a8
52
src/main.rs
52
src/main.rs
@ -1,7 +1,7 @@
|
|||||||
use std::error;
|
use std::error;
|
||||||
use std::io::{self, Write};
|
use std::io::{self, Write};
|
||||||
use std::process;
|
use std::process;
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::Mutex;
|
||||||
use std::time::Instant;
|
use std::time::Instant;
|
||||||
|
|
||||||
use ignore::WalkState;
|
use ignore::WalkState;
|
||||||
@ -55,16 +55,15 @@ fn main() {
|
|||||||
fn try_main(args: Args) -> Result<()> {
|
fn try_main(args: Args) -> Result<()> {
|
||||||
use args::Command::*;
|
use args::Command::*;
|
||||||
|
|
||||||
let matched =
|
let matched = match args.command()? {
|
||||||
match args.command()? {
|
Search => search(&args),
|
||||||
Search => search(&args),
|
SearchParallel => search_parallel(&args),
|
||||||
SearchParallel => search_parallel(&args),
|
SearchNever => Ok(false),
|
||||||
SearchNever => Ok(false),
|
Files => files(&args),
|
||||||
Files => files(&args),
|
FilesParallel => files_parallel(&args),
|
||||||
FilesParallel => files_parallel(&args),
|
Types => types(&args),
|
||||||
Types => types(&args),
|
PCRE2Version => pcre2_version(&args),
|
||||||
PCRE2Version => pcre2_version(&args),
|
}?;
|
||||||
}?;
|
|
||||||
if matched && (args.quiet() || !messages::errored()) {
|
if matched && (args.quiet() || !messages::errored()) {
|
||||||
process::exit(0)
|
process::exit(0)
|
||||||
} else if messages::errored() {
|
} else if messages::errored() {
|
||||||
@ -126,24 +125,21 @@ fn search_parallel(args: &Args) -> Result<bool> {
|
|||||||
|
|
||||||
let quit_after_match = args.quit_after_match()?;
|
let quit_after_match = args.quit_after_match()?;
|
||||||
let started_at = Instant::now();
|
let started_at = Instant::now();
|
||||||
let subject_builder = Arc::new(args.subject_builder());
|
let subject_builder = args.subject_builder();
|
||||||
let bufwtr = Arc::new(args.buffer_writer()?);
|
let bufwtr = args.buffer_writer()?;
|
||||||
let stats = Arc::new(args.stats()?.map(Mutex::new));
|
let stats = args.stats()?.map(Mutex::new);
|
||||||
let matched = Arc::new(AtomicBool::new(false));
|
let matched = AtomicBool::new(false);
|
||||||
let mut searcher_err = None;
|
let mut searcher_err = None;
|
||||||
args.walker_parallel()?.run(|| {
|
args.walker_parallel()?.run(|| {
|
||||||
let args = args.clone();
|
let bufwtr = &bufwtr;
|
||||||
let bufwtr = Arc::clone(&bufwtr);
|
let stats = &stats;
|
||||||
let stats = Arc::clone(&stats);
|
let matched = &matched;
|
||||||
let matched = Arc::clone(&matched);
|
let subject_builder = &subject_builder;
|
||||||
let subject_builder = Arc::clone(&subject_builder);
|
|
||||||
let mut searcher = match args.search_worker(bufwtr.buffer()) {
|
let mut searcher = match args.search_worker(bufwtr.buffer()) {
|
||||||
Ok(searcher) => searcher,
|
Ok(searcher) => searcher,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
searcher_err = Some(err);
|
searcher_err = Some(err);
|
||||||
return Box::new(move |_| {
|
return Box::new(move |_| WalkState::Quit);
|
||||||
WalkState::Quit
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -185,7 +181,7 @@ fn search_parallel(args: &Args) -> Result<bool> {
|
|||||||
if let Some(err) = searcher_err.take() {
|
if let Some(err) = searcher_err.take() {
|
||||||
return Err(err);
|
return Err(err);
|
||||||
}
|
}
|
||||||
if let Some(ref locked_stats) = *stats {
|
if let Some(ref locked_stats) = stats {
|
||||||
let elapsed = Instant::now().duration_since(started_at);
|
let elapsed = Instant::now().duration_since(started_at);
|
||||||
let stats = locked_stats.lock().unwrap();
|
let stats = locked_stats.lock().unwrap();
|
||||||
let mut searcher = args.search_worker(args.stdout())?;
|
let mut searcher = args.search_worker(args.stdout())?;
|
||||||
@ -235,9 +231,9 @@ fn files_parallel(args: &Args) -> Result<bool> {
|
|||||||
use std::thread;
|
use std::thread;
|
||||||
|
|
||||||
let quit_after_match = args.quit_after_match()?;
|
let quit_after_match = args.quit_after_match()?;
|
||||||
let subject_builder = Arc::new(args.subject_builder());
|
let subject_builder = args.subject_builder();
|
||||||
let mut path_printer = args.path_printer(args.stdout())?;
|
let mut path_printer = args.path_printer(args.stdout())?;
|
||||||
let matched = Arc::new(AtomicBool::new(false));
|
let matched = AtomicBool::new(false);
|
||||||
let (tx, rx) = mpsc::channel::<Subject>();
|
let (tx, rx) = mpsc::channel::<Subject>();
|
||||||
|
|
||||||
let print_thread = thread::spawn(move || -> io::Result<()> {
|
let print_thread = thread::spawn(move || -> io::Result<()> {
|
||||||
@ -247,8 +243,8 @@ fn files_parallel(args: &Args) -> Result<bool> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
});
|
});
|
||||||
args.walker_parallel()?.run(|| {
|
args.walker_parallel()?.run(|| {
|
||||||
let subject_builder = Arc::clone(&subject_builder);
|
let subject_builder = &subject_builder;
|
||||||
let matched = Arc::clone(&matched);
|
let matched = &matched;
|
||||||
let tx = tx.clone();
|
let tx = tx.clone();
|
||||||
|
|
||||||
Box::new(move |result| {
|
Box::new(move |result| {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user