diff options
author | Bert Belder <bertbelder@gmail.com> | 2021-11-02 08:15:20 +0100 |
---|---|---|
committer | Bert Belder <bertbelder@gmail.com> | 2021-11-08 12:49:10 -0800 |
commit | 4c468628d4639a646a50a680ebcfefbc8735badb (patch) | |
tree | 8c7d76e6a45c01b532f7450d3c1576d203d6a1a7 | |
parent | 80d3a5f8be667c793d359ab7e67c5ede66b37f48 (diff) |
perf(core): optimize waker capture in AsyncRefCell (#12332)
-rw-r--r-- | core/async_cell.rs | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/core/async_cell.rs b/core/async_cell.rs index 602486df3..2e054d739 100644 --- a/core/async_cell.rs +++ b/core/async_cell.rs @@ -322,9 +322,8 @@ mod internal { // is updated, it should be impossible to add it to the current borrow. assert!(id > turn || borrow_count.try_add(M::borrow_mode()).is_none()); // Save or update the waiter's Waker. - // TODO(piscisaureus): Use will_wake() to make this more efficient. let waiter_mut = waiters[id - turn].as_mut().unwrap(); - waiter_mut.set_waker(cx.waker().clone()); + waiter_mut.set_waker(cx.waker()); Poll::Pending } } @@ -593,8 +592,15 @@ mod internal { self.borrow_mode } - pub fn set_waker(&mut self, waker: Waker) { - self.waker.replace(waker); + pub fn set_waker(&mut self, new_waker: &Waker) { + if self + .waker + .as_ref() + .filter(|waker| waker.will_wake(new_waker)) + .is_none() + { + self.waker.replace(new_waker.clone()); + } } pub fn take_waker(&mut self) -> Option<Waker> { |