Skip to content

Commit

Permalink
tweak heuristic
Browse files Browse the repository at this point in the history
  • Loading branch information
taiki-e committed Feb 6, 2022
1 parent dd86ee1 commit 3002f79
Showing 1 changed file with 3 additions and 2 deletions.
5 changes: 3 additions & 2 deletions futures-util/src/stream/futures_unordered/mod.rs
Expand Up @@ -390,6 +390,7 @@ impl<Fut: Future> Stream for FuturesUnordered<Fut> {
// Keep track of how many child futures we have polled,
// in case we want to forcibly yield.
let mut polled = 0;
let mut yielded = 0;

// Ensure `parent` is correctly set.
self.ready_to_run_queue.waker.register(cx.waker());
Expand Down Expand Up @@ -519,15 +520,15 @@ impl<Fut: Future> Stream for FuturesUnordered<Fut> {
let task = bomb.task.take().unwrap();
// If the future was awoken during polling, we assume
// the future wanted to explicitly yield.
let yielded = task.woken.load(Relaxed);
yielded += task.woken.load(Relaxed) as usize;
bomb.queue.link(task);

// If a future yields, we respect it and yield here.
// If all futures have been polled, we also yield here to
// avoid starving other tasks waiting on the executor.
// (polling the same future twice per iteration may cause
// the problem: https://github.com/rust-lang/futures-rs/pull/2333)
if yielded || polled == len {
if yielded >= 2 || polled == len {
cx.waker().wake_by_ref();
return Poll::Pending;
}
Expand Down

0 comments on commit 3002f79

Please sign in to comment.