chipset_device/io/
deferred.rs1use crate::io::IoError;
32use std::future::Future;
33use std::pin::Pin;
34use std::task::Context;
35use std::task::Poll;
36use std::task::ready;
37
38#[derive(Debug)]
43pub struct DeferredToken {
44 is_read: bool,
45 recv: mesh::OneshotReceiver<Result<(u64, usize), IoError>>,
46}
47
48impl DeferredToken {
49 pub fn poll_read(
55 &mut self,
56 cx: &mut Context<'_>,
57 bytes: &mut [u8],
58 ) -> Poll<Result<(), IoError>> {
59 assert!(self.is_read, "defer type mismatch");
60 let r = ready!(Pin::new(&mut self.recv).poll(cx));
61 match r {
62 Ok(Ok((v, len))) => {
63 assert_eq!(len, bytes.len(), "defer size mismatch");
64 bytes.copy_from_slice(&v.to_ne_bytes()[..len]);
65 Poll::Ready(Ok(()))
66 }
67 Ok(Err(e)) => Poll::Ready(Err(e)),
68 Err(_) => Poll::Ready(Err(IoError::NoResponse)),
69 }
70 }
71
72 pub fn poll_write(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), IoError>> {
76 assert!(!self.is_read, "defer type mismatch");
77 let r = ready!(Pin::new(&mut self.recv).poll(cx));
78 match r {
79 Ok(Ok(_)) => Poll::Ready(Ok(())),
80 Ok(Err(e)) => Poll::Ready(Err(e)),
81 Err(_) => Poll::Ready(Err(IoError::NoResponse)),
82 }
83 }
84
85 pub async fn write_future(mut self) -> Result<(), IoError> {
89 std::future::poll_fn(|cx| self.poll_write(cx)).await
90 }
91
92 pub async fn read_future(mut self, bytes: &mut [u8]) -> Result<(), IoError> {
97 std::future::poll_fn(|cx| self.poll_read(cx, bytes)).await
98 }
99}
100
101#[derive(Debug)]
103pub struct DeferredRead {
104 send: mesh::OneshotSender<Result<(u64, usize), IoError>>,
105}
106
107impl DeferredRead {
108 pub fn complete(self, bytes: &[u8]) {
110 let mut v = [0; 8];
111 v[..bytes.len()].copy_from_slice(bytes);
112 self.send.send(Ok((u64::from_ne_bytes(v), bytes.len())));
113 }
114
115 pub fn complete_error(self, error: IoError) {
117 self.send.send(Err(error));
118 }
119}
120
121#[derive(Debug)]
123pub struct DeferredWrite {
124 send: mesh::OneshotSender<Result<(u64, usize), IoError>>,
125}
126
127impl DeferredWrite {
128 pub fn complete(self) {
130 self.send.send(Ok((0, 0)));
131 }
132
133 pub fn complete_error(self, error: IoError) {
135 self.send.send(Err(error));
136 }
137}
138
139pub fn defer_read() -> (DeferredRead, DeferredToken) {
141 let (send, recv) = mesh::oneshot();
142 (
143 DeferredRead { send },
144 DeferredToken {
145 is_read: true,
146 recv,
147 },
148 )
149}
150
151pub fn defer_write() -> (DeferredWrite, DeferredToken) {
153 let (send, recv) = mesh::oneshot();
154 (
155 DeferredWrite { send },
156 DeferredToken {
157 is_read: false,
158 recv,
159 },
160 )
161}