Skip to main content

async_selector/selector/
borrowed.rs

1use std::{
2    ops::{Deref, DerefMut},
3    pin::Pin,
4    sync::Arc,
5};
6
7use crate::{
8    list::cursor::{BorrowedNode, BorrowedNodeMut},
9    mpsc,
10    selector::Id,
11    task::Task,
12};
13
14/// An immutable borrow of a task stored in a [`Selector`](crate::selector::Selector).
15pub struct Borrowed<'a, P> {
16    pub(super) node: BorrowedNode<'a, Task<P>>,
17    pub(super) queue: &'a mpsc::Receiver<Task<P>>,
18}
19
20impl<P> Borrowed<'_, P> {
21    /// Manually wakes the task.
22    pub fn wake(&self) {
23        let node = self.node.node().clone();
24        self.queue.send(node);
25    }
26
27    /// Returns the id of this task.
28    pub fn id(&self) -> Id {
29        let node = self.node.node();
30        Id::new(Arc::downgrade(node), node.ready_tx().clone())
31    }
32}
33
34impl<P> Deref for Borrowed<'_, P> {
35    type Target = P;
36
37    fn deref(&self) -> &Self::Target {
38        self.node.get_protected()
39    }
40}
41
42/// Mutable borrow of a task stored in a [`Selector`](crate::selector::Selector).
43///
44/// **Important:** before modifying tasks stored in the selector, see the wakeups [section](crate::selector::Selector#wakeups).
45pub struct BorrowedMut<'a, P> {
46    pub(super) node: BorrowedNodeMut<'a, Task<P>>,
47    pub(super) queue: &'a mpsc::Receiver<Task<P>>,
48}
49
50impl<P> BorrowedMut<'_, P> {
51    /// Manually wakes the task.
52    pub fn wake(&self) {
53        let node = self.node.node().clone();
54        self.queue.send(node);
55    }
56
57    /// Returns the id of this task.
58    pub fn id(&self) -> Id {
59        let node = self.node.node();
60        Id::new(Arc::downgrade(node), node.ready_tx().clone())
61    }
62
63    /// Returns a pinned reference to the task.
64    ///
65    /// **Important:** before modifying tasks stored in the selector, see the wakeups [section](crate::selector::Selector#wakeups).
66    pub fn get_mut(&mut self) -> Pin<&mut P> {
67        self.node.get_protected_mut()
68    }
69}
70
71impl<P> Deref for BorrowedMut<'_, P> {
72    type Target = P;
73
74    fn deref(&self) -> &Self::Target {
75        self.node.get_protected()
76    }
77}
78
79impl<P: Unpin> DerefMut for BorrowedMut<'_, P> {
80    fn deref_mut(&mut self) -> &mut Self::Target {
81        self.get_mut().get_mut()
82    }
83}