From e7f192f1c6f16144c921bd5c33544750d2494f15 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Tue, 28 Dec 2021 12:11:32 -0500 Subject: [PATCH] Revert "Switch from std::sync::mpsc to crossbeam-channel" @sharkdp [noticed][1] a quite severe performance degredation due to this change. Switch back to std::sync::mpsc until we can fix the performance regression. This reverts commit a4bb734482c7bf3fd4d30081e7d3ce7786a3775e. [1]: https://github.com/sharkdp/fd/pull/895#issuecomment-1002099369 --- Cargo.lock | 11 ----------- Cargo.toml | 1 - src/exec/job.rs | 3 +-- src/walk.rs | 10 +++++++--- 4 files changed, 8 insertions(+), 17 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index aa88064..45d3b4b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -99,16 +99,6 @@ dependencies = [ "vec_map", ] -[[package]] -name = "crossbeam-channel" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] - [[package]] name = "crossbeam-utils" version = "0.8.5" @@ -165,7 +155,6 @@ dependencies = [ "atty", "chrono", "clap", - "crossbeam-channel", "ctrlc", "diff", "dirs-next", diff --git a/Cargo.toml b/Cargo.toml index 67e2325..25b8f78 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -49,7 +49,6 @@ dirs-next = "2.0" normpath = "0.3" chrono = "0.4" once_cell = "1.8.0" -crossbeam-channel = "0.5.1" [dependencies.clap] version = "2.34.0" diff --git a/src/exec/job.rs b/src/exec/job.rs index 0effc44..85b30f1 100644 --- a/src/exec/job.rs +++ b/src/exec/job.rs @@ -1,8 +1,7 @@ use std::path::PathBuf; +use std::sync::mpsc::Receiver; use std::sync::{Arc, Mutex}; -use crossbeam_channel::Receiver; - use crate::error::print_error; use crate::exit_codes::{merge_exitcodes, ExitCode}; use crate::walk::WorkerResult; diff --git a/src/walk.rs b/src/walk.rs index 037baae..0d412ba 100644 --- a/src/walk.rs +++ b/src/walk.rs @@ -4,13 +4,13 @@ use std::io; use std::mem; use std::path::{Path, PathBuf}; use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::mpsc::{channel, Receiver, RecvTimeoutError, Sender}; use std::sync::{Arc, Mutex}; use std::thread; use std::time::{Duration, Instant}; use std::{borrow::Cow, io::Write}; use anyhow::{anyhow, Result}; -use crossbeam_channel::{unbounded, Receiver, RecvTimeoutError, Sender}; use ignore::overrides::OverrideBuilder; use ignore::{self, WalkBuilder}; use once_cell::unsync::OnceCell; @@ -55,7 +55,7 @@ pub fn scan(path_vec: &[PathBuf], pattern: Arc, config: Arc) -> R let first_path_buf = path_iter .next() .expect("Error: Path vector can not be empty"); - let (tx, rx) = unbounded(); + let (tx, rx) = channel(); let mut override_builder = OverrideBuilder::new(first_path_buf.as_path()); @@ -232,7 +232,11 @@ impl ReceiverBuffer { match self.mode { ReceiverMode::Buffering => { // Wait at most until we should switch to streaming - self.rx.recv_deadline(self.deadline) + let now = Instant::now(); + self.deadline + .checked_duration_since(now) + .ok_or(RecvTimeoutError::Timeout) + .and_then(|t| self.rx.recv_timeout(t)) } ReceiverMode::Streaming => { // Wait however long it takes for a result