async_selector/selector/
borrowed.rs1use 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
14pub 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 pub fn wake(&self) {
23 let node = self.node.node().clone();
24 self.queue.send(node);
25 }
26
27 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
42pub 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 pub fn wake(&self) {
53 let node = self.node.node().clone();
54 self.queue.send(node);
55 }
56
57 pub fn id(&self) -> Id {
59 let node = self.node.node();
60 Id::new(Arc::downgrade(node), node.ready_tx().clone())
61 }
62
63 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}