From bc9a62c8cada22da6ed9b2b832ce90045e2e195f Mon Sep 17 00:00:00 2001 From: Nur Date: Wed, 31 Dec 2025 08:07:17 +0600 Subject: [PATCH] local-waker (perf): Avoid `Waker::clone` on 2nd registration --- local-waker/src/lib.rs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/local-waker/src/lib.rs b/local-waker/src/lib.rs index 6a6a5558..d83a4bc0 100644 --- a/local-waker/src/lib.rs +++ b/local-waker/src/lib.rs @@ -6,7 +6,7 @@ #![deny(rust_2018_idioms, nonstandard_style)] #![warn(future_incompatible, missing_docs)] -use core::{cell::Cell, fmt, marker::PhantomData, task::Waker}; +use core::{cell::UnsafeCell, fmt, marker::PhantomData, task::Waker}; /// A synchronization primitive for task wakeup. /// @@ -27,7 +27,7 @@ use core::{cell::Cell, fmt, marker::PhantomData, task::Waker}; /// [`wake`]: LocalWaker::wake #[derive(Default)] pub struct LocalWaker { - pub(crate) waker: Cell>, + pub(crate) waker: UnsafeCell>, // mark LocalWaker as a !Send type. _phantom: PhantomData<*const ()>, } @@ -43,8 +43,15 @@ impl LocalWaker { /// Returns `true` if waker was registered before. #[inline] pub fn register(&self, waker: &Waker) -> bool { - let last_waker = self.waker.replace(Some(waker.clone())); - last_waker.is_some() + let mut registered = false; + if let Some(prev) = unsafe { &*self.waker.get() } { + if waker.will_wake(prev) { + return true; + } + registered = true; + } + unsafe { *self.waker.get() = Some(waker.clone()) } + registered } /// Calls `wake` on the last `Waker` passed to `register`. @@ -62,7 +69,7 @@ impl LocalWaker { /// If a waker has not been registered, this returns `None`. #[inline] pub fn take(&self) -> Option { - self.waker.take() + unsafe { (*self.waker.get()).take() } } }