From 58a1719c983e9901bb3762966e9a25ea3251d248 Mon Sep 17 00:00:00 2001 From: Stephan Dilly Date: Sat, 18 Jul 2020 13:57:08 +0200 Subject: [PATCH] fix problems with spawning too many async tasks underload (#196) --- asyncgit/src/commit_files.rs | 16 +++++++++++----- asyncgit/src/diff.rs | 5 +++-- asyncgit/src/revlog.rs | 4 +++- asyncgit/src/status.rs | 5 +++-- asyncgit/src/tags.rs | 5 +++-- 5 files changed, 23 insertions(+), 12 deletions(-) diff --git a/asyncgit/src/commit_files.rs b/asyncgit/src/commit_files.rs index e837c453..265b38ee 100644 --- a/asyncgit/src/commit_files.rs +++ b/asyncgit/src/commit_files.rs @@ -57,7 +57,7 @@ impl AsyncCommitFiles { { let current = self.current.lock()?; - if let Some(ref c) = *current { + if let Some(c) = &*current { if c.0 == id { return Ok(()); } @@ -68,9 +68,9 @@ impl AsyncCommitFiles { let sender = self.sender.clone(); let arc_pending = Arc::clone(&self.pending); - rayon_core::spawn(move || { - arc_pending.fetch_add(1, Ordering::Relaxed); + self.pending.fetch_add(1, Ordering::Relaxed); + rayon_core::spawn(move || { Self::fetch_helper(id, arc_current) .expect("failed to fetch"); @@ -92,9 +92,15 @@ impl AsyncCommitFiles { ) -> Result<()> { let res = sync::get_commit_files(CWD, id)?; + log::trace!( + "get_commit_files: {} ({})", + id.to_string(), + res.len() + ); + { - let mut last = arc_current.lock()?; - *last = Some(Request(id, res)); + let mut current = arc_current.lock()?; + *current = Some(Request(id, res)); } Ok(()) diff --git a/asyncgit/src/diff.rs b/asyncgit/src/diff.rs index f149d104..7dd02ffd 100644 --- a/asyncgit/src/diff.rs +++ b/asyncgit/src/diff.rs @@ -109,9 +109,10 @@ impl AsyncDiff { let arc_last = Arc::clone(&self.last); let sender = self.sender.clone(); let arc_pending = Arc::clone(&self.pending); - rayon_core::spawn(move || { - arc_pending.fetch_add(1, Ordering::Relaxed); + self.pending.fetch_add(1, Ordering::Relaxed); + + rayon_core::spawn(move || { let notify = AsyncDiff::get_diff_helper( params, arc_last, diff --git a/asyncgit/src/revlog.rs b/asyncgit/src/revlog.rs index 281b3f09..3c78aa90 100644 --- a/asyncgit/src/revlog.rs +++ b/asyncgit/src/revlog.rs @@ -117,16 +117,18 @@ impl AsyncLog { let arc_pending = Arc::clone(&self.pending); let arc_background = Arc::clone(&self.background); + self.pending.store(true, Ordering::Relaxed); + rayon_core::spawn(move || { scope_time!("async::revlog"); - arc_pending.store(true, Ordering::Relaxed); AsyncLog::fetch_helper( arc_current, arc_background, &sender, ) .expect("failed to fetch"); + arc_pending.store(false, Ordering::Relaxed); Self::notify(&sender); diff --git a/asyncgit/src/status.rs b/asyncgit/src/status.rs index 80baf472..75ffb69d 100644 --- a/asyncgit/src/status.rs +++ b/asyncgit/src/status.rs @@ -116,9 +116,10 @@ impl AsyncStatus { let arc_pending = Arc::clone(&self.pending); let status_type = params.status_type; let include_untracked = params.include_untracked; - rayon_core::spawn(move || { - arc_pending.fetch_add(1, Ordering::Relaxed); + self.pending.fetch_add(1, Ordering::Relaxed); + + rayon_core::spawn(move || { Self::fetch_helper( status_type, include_untracked, diff --git a/asyncgit/src/tags.rs b/asyncgit/src/tags.rs index 20999c69..f23b54af 100644 --- a/asyncgit/src/tags.rs +++ b/asyncgit/src/tags.rs @@ -74,9 +74,10 @@ impl AsyncTags { let arc_last = Arc::clone(&self.last); let sender = self.sender.clone(); let arc_pending = Arc::clone(&self.pending); - rayon_core::spawn(move || { - arc_pending.fetch_add(1, Ordering::Relaxed); + self.pending.fetch_add(1, Ordering::Relaxed); + + rayon_core::spawn(move || { let notify = AsyncTags::getter(arc_last) .expect("error getting tags");