summaryrefslogtreecommitdiffstats
path: root/src/walk.rs
diff options
context:
space:
mode:
authorsharkdp <davidpeter@web.de>2018-11-04 19:08:26 +0100
committerDavid Peter <sharkdp@users.noreply.github.com>2018-11-04 21:33:14 +0100
commitb0cd527c62bd1b7139f685aa2d17293040fd7566 (patch)
tree7a19e184a31835bdbcc7aee64e1d1038d717508b /src/walk.rs
parent9c4c63f7571b61fdf77d878b434d4cf69e5095e7 (diff)
Reduce number of syscalls
Diffstat (limited to 'src/walk.rs')
-rw-r--r--src/walk.rs31
1 files changed, 16 insertions, 15 deletions
diff --git a/src/walk.rs b/src/walk.rs
index cbf0656..b80df07 100644
--- a/src/walk.rs
+++ b/src/walk.rs
@@ -2,17 +2,18 @@ use std::collections::HashSet;
use std::fs;
use std::os::unix::fs::MetadataExt;
use std::path::PathBuf;
-use std::sync::mpsc::{channel, Sender};
use std::thread;
+use crossbeam_channel as channel;
+
use rayon::prelude::*;
type UniqueID = (u64, u64);
type SizeEntry = (Option<UniqueID>, u64);
-fn walk(tx: Sender<SizeEntry>, entries: &[PathBuf]) {
- entries.par_iter().for_each_with(tx, |tx_ref, entry| {
+fn walk(tx: channel::Sender<SizeEntry>, entries: &[PathBuf]) {
+ entries.into_par_iter().for_each_with(tx, |tx_ref, entry| {
if let Ok(metadata) = entry.metadata() {
// If the entry has more than one hard link, generate
// a unique ID consisting of device and inode in order
@@ -26,20 +27,20 @@ fn walk(tx: Sender<SizeEntry>, entries: &[PathBuf]) {
let size = metadata.len();
tx_ref.send((unique_id, size)).unwrap();
- } else {
- eprintln!("Could not get metadata: '{}'", entry.to_string_lossy());
- };
- if entry.is_dir() {
- let mut children = vec![];
- for child_entry in fs::read_dir(entry).unwrap() {
- if let Ok(child_entry) = child_entry {
- let path = child_entry.path();
- children.push(PathBuf::from(path));
+ if metadata.is_dir() {
+ let mut children = vec![];
+ for child_entry in fs::read_dir(entry).unwrap() {
+ if let Ok(child_entry) = child_entry {
+ let path = child_entry.path();
+ children.push(PathBuf::from(path));
+ }
}
- }
- walk(tx_ref.clone(), &children[..]);
+ walk(tx_ref.clone(), &children[..]);
+ };
+ } else {
+ eprintln!("Could not get metadata: '{}'", entry.to_string_lossy());
};
});
}
@@ -58,7 +59,7 @@ impl<'a> Walk<'a> {
}
pub fn run(&self) -> u64 {
- let (tx, rx) = channel();
+ let (tx, rx) = channel::unbounded();
let receiver_thread = thread::spawn(move || {
let mut total = 0;