summaryrefslogtreecommitdiffstats
path: root/tokio/src/task/local.rs
diff options
context:
space:
mode:
authorCarl Lerche <me@carllerche.com>2020-05-06 19:02:07 -0700
committerGitHub <noreply@github.com>2020-05-06 19:02:07 -0700
commit4748b2571fc02d5ebbfe59e457f0e8d8ef0eb5f3 (patch)
tree73da1e3baba02bad5411a222ff62490304932fe7 /tokio/src/task/local.rs
parent66fef4a9bcccd944e3b72b1e83f789e4131d4e52 (diff)
rt: simplify coop implementation (#2498)
Simplifies coop implementation. Prunes unused code, create a `Budget` type to track the current budget.
Diffstat (limited to 'tokio/src/task/local.rs')
-rw-r--r--tokio/src/task/local.rs62
1 files changed, 27 insertions, 35 deletions
diff --git a/tokio/src/task/local.rs b/tokio/src/task/local.rs
index 346fe437..374671fb 100644
--- a/tokio/src/task/local.rs
+++ b/tokio/src/task/local.rs
@@ -454,24 +454,20 @@ impl Future for LocalSet {
// Register the waker before starting to work
self.context.shared.waker.register_by_ref(cx.waker());
- // Reset any previous task budget while polling tasks spawned on the
- // `LocalSet`, ensuring that each has its own separate budget.
- crate::coop::reset(|| {
- if self.with(|| self.tick()) {
- // If `tick` returns true, we need to notify the local future again:
- // there are still tasks remaining in the run queue.
- cx.waker().wake_by_ref();
- Poll::Pending
- } else if self.context.tasks.borrow().owned.is_empty() {
- // If the scheduler has no remaining futures, we're done!
- Poll::Ready(())
- } else {
- // There are still futures in the local set, but we've polled all the
- // futures in the run queue. Therefore, we can just return Pending
- // since the remaining futures will be woken from somewhere else.
- Poll::Pending
- }
- })
+ if self.with(|| self.tick()) {
+ // If `tick` returns true, we need to notify the local future again:
+ // there are still tasks remaining in the run queue.
+ cx.waker().wake_by_ref();
+ Poll::Pending
+ } else if self.context.tasks.borrow().owned.is_empty() {
+ // If the scheduler has no remaining futures, we're done!
+ Poll::Ready(())
+ } else {
+ // There are still futures in the local set, but we've polled all the
+ // futures in the run queue. Therefore, we can just return Pending
+ // since the remaining futures will be woken from somewhere else.
+ Poll::Pending
+ }
}
}
@@ -525,23 +521,19 @@ impl<T: Future> Future for RunUntil<'_, T> {
.register_by_ref(cx.waker());
let _no_blocking = crate::runtime::enter::disallow_blocking();
- // Reset any previous task budget so that the future passed to
- // `run_until` and any tasks spawned on the `LocalSet` have their
- // own budgets.
- crate::coop::reset(|| {
- let f = me.future;
- if let Poll::Ready(output) = crate::coop::budget(|| f.poll(cx)) {
- return Poll::Ready(output);
- }
-
- if me.local_set.tick() {
- // If `tick` returns `true`, we need to notify the local future again:
- // there are still tasks remaining in the run queue.
- cx.waker().wake_by_ref();
- }
-
- Poll::Pending
- })
+ let f = me.future;
+
+ if let Poll::Ready(output) = crate::coop::budget(|| f.poll(cx)) {
+ return Poll::Ready(output);
+ }
+
+ if me.local_set.tick() {
+ // If `tick` returns `true`, we need to notify the local future again:
+ // there are still tasks remaining in the run queue.
+ cx.waker().wake_by_ref();
+ }
+
+ Poll::Pending
})
}
}