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 {
18        let node = self.0.node();
19        Id::new(Arc::downgrade(node), node.ready_tx().clone())
20    }
21
22    /// Returns a pinned reference to the task.
23    pub fn get_mut(&mut self) -> Pin<&mut P> {
24        self.0.protected_mut()
25    }
26
27    /// Consumes this wrapper and returns the task.
28    pub fn into_inner(self) -> P
29    where
30        P: Unpin,
31    {
32        self.0.into_inner()
33    }
34}
35
36impl<P> AsRef<P> for Removed<P> {
37    fn as_ref(&self) -> &P {
38        self.0.protected()
39    }
40}
41
42impl<P> Deref for Removed<P> {
43    type Target = P;
44
45    fn deref(&self) -> &Self::Target {
46        self.0.protected()
47    }
48}
49
50impl<P: Unpin> DerefMut for Removed<P> {
51    fn deref_mut(&mut self) -> &mut Self::Target {
52        self.0.protected_mut().get_mut()
53    }
54}