Skip to content

Commit 58a1719

Browse files
author
Stephan Dilly
committed
fix problems with spawning too many async tasks underload (#196)
1 parent 7e8df3a commit 58a1719

File tree

5 files changed

+23
-12
lines changed

5 files changed

+23
-12
lines changed

asyncgit/src/commit_files.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ impl AsyncCommitFiles {
5757

5858
{
5959
let current = self.current.lock()?;
60-
if let Some(ref c) = *current {
60+
if let Some(c) = &*current {
6161
if c.0 == id {
6262
return Ok(());
6363
}
@@ -68,9 +68,9 @@ impl AsyncCommitFiles {
6868
let sender = self.sender.clone();
6969
let arc_pending = Arc::clone(&self.pending);
7070

71-
rayon_core::spawn(move || {
72-
arc_pending.fetch_add(1, Ordering::Relaxed);
71+
self.pending.fetch_add(1, Ordering::Relaxed);
7372

73+
rayon_core::spawn(move || {
7474
Self::fetch_helper(id, arc_current)
7575
.expect("failed to fetch");
7676

@@ -92,9 +92,15 @@ impl AsyncCommitFiles {
9292
) -> Result<()> {
9393
let res = sync::get_commit_files(CWD, id)?;
9494

95+
log::trace!(
96+
"get_commit_files: {} ({})",
97+
id.to_string(),
98+
res.len()
99+
);
100+
95101
{
96-
let mut last = arc_current.lock()?;
97-
*last = Some(Request(id, res));
102+
let mut current = arc_current.lock()?;
103+
*current = Some(Request(id, res));
98104
}
99105

100106
Ok(())

asyncgit/src/diff.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,10 @@ impl AsyncDiff {
109109
let arc_last = Arc::clone(&self.last);
110110
let sender = self.sender.clone();
111111
let arc_pending = Arc::clone(&self.pending);
112-
rayon_core::spawn(move || {
113-
arc_pending.fetch_add(1, Ordering::Relaxed);
114112

113+
self.pending.fetch_add(1, Ordering::Relaxed);
114+
115+
rayon_core::spawn(move || {
115116
let notify = AsyncDiff::get_diff_helper(
116117
params,
117118
arc_last,

asyncgit/src/revlog.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,16 +117,18 @@ impl AsyncLog {
117117
let arc_pending = Arc::clone(&self.pending);
118118
let arc_background = Arc::clone(&self.background);
119119

120+
self.pending.store(true, Ordering::Relaxed);
121+
120122
rayon_core::spawn(move || {
121123
scope_time!("async::revlog");
122124

123-
arc_pending.store(true, Ordering::Relaxed);
124125
AsyncLog::fetch_helper(
125126
arc_current,
126127
arc_background,
127128
&sender,
128129
)
129130
.expect("failed to fetch");
131+
130132
arc_pending.store(false, Ordering::Relaxed);
131133

132134
Self::notify(&sender);

asyncgit/src/status.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,10 @@ impl AsyncStatus {
116116
let arc_pending = Arc::clone(&self.pending);
117117
let status_type = params.status_type;
118118
let include_untracked = params.include_untracked;
119-
rayon_core::spawn(move || {
120-
arc_pending.fetch_add(1, Ordering::Relaxed);
121119

120+
self.pending.fetch_add(1, Ordering::Relaxed);
121+
122+
rayon_core::spawn(move || {
122123
Self::fetch_helper(
123124
status_type,
124125
include_untracked,

asyncgit/src/tags.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,10 @@ impl AsyncTags {
7474
let arc_last = Arc::clone(&self.last);
7575
let sender = self.sender.clone();
7676
let arc_pending = Arc::clone(&self.pending);
77-
rayon_core::spawn(move || {
78-
arc_pending.fetch_add(1, Ordering::Relaxed);
7977

78+
self.pending.fetch_add(1, Ordering::Relaxed);
79+
80+
rayon_core::spawn(move || {
8081
let notify = AsyncTags::getter(arc_last)
8182
.expect("error getting tags");
8283

0 commit comments

Comments
 (0)