1
0
mirror of https://github.com/fafhrd91/actix-net synced 2025-03-20 16:05:18 +01:00

Refactor LocalWaker for use Cell and remove deprecated methods (#278)

This commit is contained in:
Juan Aguilar 2021-02-19 18:12:30 +01:00 committed by GitHub
parent cb07ead392
commit 2cfe1d88ad
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,4 +1,4 @@
use core::cell::UnsafeCell; use core::cell::Cell;
use core::fmt; use core::fmt;
use core::marker::PhantomData; use core::marker::PhantomData;
use core::task::Waker; use core::task::Waker;
@ -19,10 +19,9 @@ use core::task::Waker;
/// ///
/// A single `AtomicWaker` may be reused for any number of calls to `register` or /// A single `AtomicWaker` may be reused for any number of calls to `register` or
/// `wake`. /// `wake`.
// TODO: Refactor to Cell when remove deprecated methods (@botika)
#[derive(Default)] #[derive(Default)]
pub struct LocalWaker { pub struct LocalWaker {
pub(crate) waker: UnsafeCell<Option<Waker>>, pub(crate) waker: Cell<Option<Waker>>,
// mark LocalWaker as a !Send type. // mark LocalWaker as a !Send type.
_t: PhantomData<*const ()>, _t: PhantomData<*const ()>,
} }
@ -31,31 +30,18 @@ impl LocalWaker {
/// Create an `LocalWaker`. /// Create an `LocalWaker`.
pub fn new() -> Self { pub fn new() -> Self {
LocalWaker { LocalWaker {
waker: UnsafeCell::new(None), waker: Cell::new(None),
_t: PhantomData, _t: PhantomData,
} }
} }
#[deprecated(
since = "2.1.0",
note = "In favor of `wake`. State of the register doesn't matter at `wake` up"
)]
/// Check if waker has been registered.
#[inline]
pub fn is_registered(&self) -> bool {
unsafe { (*self.waker.get()).is_some() }
}
/// Registers the waker to be notified on calls to `wake`. /// Registers the waker to be notified on calls to `wake`.
/// ///
/// Returns `true` if waker was registered before. /// Returns `true` if waker was registered before.
#[inline] #[inline]
pub fn register(&self, waker: &Waker) -> bool { pub fn register(&self, waker: &Waker) -> bool {
unsafe { let last_waker = self.waker.replace(Some(waker.clone()));
let w = self.waker.get(); last_waker.is_some()
let last_waker = w.replace(Some(waker.clone()));
last_waker.is_some()
}
} }
/// Calls `wake` on the last `Waker` passed to `register`. /// Calls `wake` on the last `Waker` passed to `register`.
@ -73,7 +59,7 @@ impl LocalWaker {
/// If a waker has not been registered, this returns `None`. /// If a waker has not been registered, this returns `None`.
#[inline] #[inline]
pub fn take(&self) -> Option<Waker> { pub fn take(&self) -> Option<Waker> {
unsafe { (*self.waker.get()).take() } self.waker.take()
} }
} }