mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-08-07 00:00:09 +02:00
time: defer waker clone on spurious poll (#8107)
This commit is contained in:
@@ -228,11 +228,16 @@ impl Handle {
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn register_waker(&self, waker: Waker) {
|
||||
pub(crate) fn register_waker(&self, waker: &Waker) {
|
||||
let mut lock = self.entry.state.lock();
|
||||
if !lock.cancelled && !lock.woken_up {
|
||||
let maybe_old_waker = lock.waker.replace(waker);
|
||||
// unlock before calling waker
|
||||
// PANIC: no intermediary state is possible should the user-controllable `Waker`
|
||||
// panic on `Clone` or `Drop`.
|
||||
let maybe_old_waker = match &lock.waker {
|
||||
Some(current_waker) if current_waker.will_wake(waker) => None,
|
||||
_ => lock.waker.replace(waker.clone()),
|
||||
};
|
||||
// unlock before dropping waker
|
||||
drop(lock);
|
||||
drop(maybe_old_waker);
|
||||
}
|
||||
|
||||
@@ -97,7 +97,7 @@ impl Timer {
|
||||
match self.entry.as_ref() {
|
||||
Some(entry) if entry.is_woken_up() => Poll::Ready(()),
|
||||
Some(entry) => {
|
||||
entry.register_waker(cx.waker().clone());
|
||||
entry.register_waker(cx.waker());
|
||||
Poll::Pending
|
||||
}
|
||||
None => self.register(cx),
|
||||
|
||||
Reference in New Issue
Block a user