From dbdd25812985649991d13411e9540e63be4f33ee Mon Sep 17 00:00:00 2001 From: rabite Date: Fri, 14 Feb 2020 15:14:11 +0100 Subject: tame rouge io-threads --- src/files.rs | 38 ++++++++++++++++++++++++++------------ src/listview.rs | 1 - 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/files.rs b/src/files.rs index 405feca..7e21029 100644 --- a/src/files.rs +++ b/src/files.rs @@ -415,15 +415,16 @@ impl Files { pub fn run_jobs(&mut self, sender: Sender) { use std::time::Duration; let jobs = std::mem::take(&mut self.jobs); - let stale = self.stale.clone() - .unwrap_or(Stale::new()); + let stale = self.stale + .clone() + .unwrap_or_else(Stale::new); if jobs.len() == 0 { return; } std::thread::spawn(move || { let pool = get_pool(); - let jobs_left = AtomicUsize::new(jobs.len()); - let jobs_left = &jobs_left; + let stop = AtomicBool::new(false); + let stop = &stop; let stale = &stale; let ticker = move || { @@ -443,7 +444,9 @@ impl Files { } // All jobs done? - if jobs_left.load(Ordering::Relaxed) == 0 { + if stop.load(Ordering::Relaxed) { + crate::files::tick(); + std::thread::sleep(cooldown); // Refresh one last time sender.send(crate::widget::Events::WidgetReady) .unwrap(); @@ -474,8 +477,14 @@ impl Files { // Noop with other pool running ticker ticker().map(|t| s.spawn_fifo(move |_| t())); - for (path, mslot, dirsize) in jobs.into_iter().stop_stale(stale.clone()) + let jobs_num = jobs.len(); + + for (i, (path, mslot, dirsize)) in jobs.into_iter() + .stop_stale(stale.clone()) + .enumerate() { + ticker().map(|t| s.spawn_fifo(move |_| t())); + s.spawn_fifo(move |_| { if let Some(mslot) = mslot { if let Ok(meta) = std::fs::symlink_metadata(&path) { @@ -494,15 +503,20 @@ impl Files { dirsize.0.store(true, Ordering::Relaxed); dirsize.1.store(size, Ordering::Relaxed); + }; - // Ticker will only stop after this reaches 0 - jobs_left.fetch_sub(1, Ordering::Relaxed); + // This is the last job, stop ticking + if jobs_num == i + 1 { + stop.store(true, Ordering::Relaxed); } }); + } - ticker().map(|t| s.spawn_fifo(move |_| t())); + // Stop ticking if loop breaks on stale + if stale.is_stale().unwrap_or(true) { + stop.store(true, Ordering::Relaxed); } - }); + }) }); } @@ -1096,8 +1110,8 @@ impl File { let size = match self.dirsize { Some(ref dirsize) => { let (ref ready, ref size) = **dirsize; - if ready.load(Ordering::Acquire) == true { - (size.load(Ordering::Acquire), "") + if ready.load(Ordering::Relaxed) == true { + (size.load(Ordering::Relaxed), "") } else { return Err(FileError::MetaPending)?; } diff --git a/src/listview.rs b/src/listview.rs index e2bbed9..7cddfbf 100644 --- a/src/listview.rs +++ b/src/listview.rs @@ -749,7 +749,6 @@ impl ListView let (size, unit) = match size { Ok((size, unit)) => (size.to_string(), unit), Err(HError::FileError(FileError::MetaPending)) => { - // Using mod 5 explicitly here for that nice nonlinear look let ticks = crate::files::tick_str(); (String::from(ticks), "") }, -- cgit v1.2.3