Skip to main content

async_selector/selector/
removed.rs

1use std::{
2    ops::{Deref, DerefMut},
3    pin::Pin,
4    sync::Arc,
5};
6
7use crate::{list, selector::Id, task::Task};
8
9/// Task removed from a [`Selector`](crate::selector::Selector).
10///
11/// **Important:** before removing tasks from the selector, see the removal [section](crate::selector::Selector#removal).
12#[must_use = "memory occupied by a removed task is not freed immediately, see Selector docs"]
13pub struct Removed<P>(pub(super) list::Removed<Task<P>>);
14
15impl<P> Removed<P> {
16    /// Returns the id of this task.
17    pub fn id(&self) -> Id<P> {
18        Id(Arc::downgrade(self.0.node()))
19    }
20
21    /// Returns a pinned reference to the task.
22    pub fn get_mut(&mut self) -> Pin<&mut P> {
23        self.0.protected_mut()
24    }
25
26    /// Consumes this wrapper and returns the task.
27    pub fn into_inner(self) -> P
28    where
29        P: Unpin,
30    {
31        self.0.into_inner()
32    }
33}
34
35impl<P> AsRef<P> for Removed<P> {
36    fn as_ref(&self) -> &P {
37        self.0.protected()
38    }
39}
40
41impl<P> Deref for Removed<P> {
42    type Target = P;
43
44    fn deref(&self) -> &Self::Target {
45        self.0.protected()
46    }
47}
48
49impl<P: Unpin> DerefMut for Removed<P> {
50    fn deref_mut(&mut self) -> &mut Self::Target {
51        self.0.protected_mut().get_mut()
52    }
53}