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
86#[derive(Debug)]
88pub struct DeferredRead {
89 send: mesh::OneshotSender<Result<(u64, usize), IoError>>,
90}
91
92impl DeferredRead {
93 pub fn complete(self, bytes: &[u8]) {
95 let mut v = [0; 8];
96 v[..bytes.len()].copy_from_slice(bytes);
97 self.send.send(Ok((u64::from_ne_bytes(v), bytes.len())));
98 }
99
100 pub fn complete_error(self, error: IoError) {
102 self.send.send(Err(error));
103 }
104}
105
106#[derive(Debug)]
108pub struct DeferredWrite {
109 send: mesh::OneshotSender<Result<(u64, usize), IoError>>,
110}
111
112impl DeferredWrite {
113 pub fn complete(self) {
115 self.send.send(Ok((0, 0)));
116 }
117
118 pub fn complete_error(self, error: IoError) {
120 self.send.send(Err(error));
121 }
122}
123
124pub fn defer_read() -> (DeferredRead, DeferredToken) {
126 let (send, recv) = mesh::oneshot();
127 (
128 DeferredRead { send },
129 DeferredToken {
130 is_read: true,
131 recv,
132 },
133 )
134}
135
136pub fn defer_write() -> (DeferredWrite, DeferredToken) {
138 let (send, recv) = mesh::oneshot();
139 (
140 DeferredWrite { send },
141 DeferredToken {
142 is_read: false,
143 recv,
144 },
145 )
146}