Struct ActualWaker

Source
struct ActualWaker {
    data: Weak<Shared>,
    id: Ti,
}
Expand description

Actual implementor of Wake for use in a Waker

Futures (eg, channels from [futures]) will use this to wake a task when it should be polled.

This type must not be Cloned with the Data lock held. Consequently, a Waker mustn’t either.

Fields§

§data: Weak<Shared>

Executor state

The Waker mustn’t to hold a strong reference to the executor, since typically a task holds a future that holds a Waker, and the executor holds the task - so that would be a cycle.

§id: Ti

Which task this is

Implementations§

Source§

impl ActualWaker

Source

fn upgrade_data(&self) -> Option<Arc<Shared>>

Obtain a strong reference to the executor’s data

Source

fn wake(&self)

Wake the task corresponding to this ActualWaker

This is like <Self as std::task::Wake>::wake() but takes &self, not Arc

Source

fn make_waker(shared: &Arc<Shared>, id: TaskId) -> Waker

Create and return a Waker for task id

Source§

impl ActualWaker

Using ActualWaker in a RawWaker

We need to make a Waker (the safe, type-erased, waker, used by actual futures) which contains an ActualWaker (our actual waker implementation, also safe).

std offers Waker::from<Arc<impl Wake>>. But we want a bespoke Clone implementation, so we don’t want to use Arc.

So instead, we implement the RawWaker API in terms of ActualWaker. We keep the ActualWaker in a Box, and actually clone it (and the Box).

SAFETY

  • The data pointer is Box::<ActualWaker>::into_raw()
  • We share these when we clone
  • No-one is allowed &mut ActualWaker unless there are no other clones
  • So we may make references &ActualWaker
Source

fn new_waker(self) -> Waker

Wrap up an ActualWaker as a type-erased Waker for passing to futures etc.

Source

fn raw_new(self) -> RawWaker

Helper: wrap up an ActualWaker as a RawWaker.

Source

unsafe fn raw_clone(self_: *const ()) -> RawWaker

Implementation of RawWakerVTable’s clone

Source

unsafe fn raw_wake(self_: *const ())

Implementation of RawWakerVTable’s wake

Source

unsafe fn raw_wake_by_ref(self_: *const ())

Implementation of RawWakerVTable’s wake_ref_by

Source

unsafe fn raw_drop(self_: *const ())

Implementation of RawWakerVTable’s drop

Trait Implementations§

Source§

impl Clone for ActualWaker

Track sleep locations via <Waker as Clone>.

See MockExecutor::debug_dump for the explanation.

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl EnsureSyncSend for ActualWaker

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where T: 'static,