-
Notifications
You must be signed in to change notification settings - Fork 156
Closed
Description
Look at this simplication I found possible in the src/driver/read.rs
pub(crate) async fn read(self) -> BufResult<usize, T> {
let complete = self.await;
// Convert the operation result to `usize`
let res = complete.result.map(|v| v as usize);
// Recover the buffer
let mut buf = complete.data.buf;
// If the operation was successful, advance the initialized cursor.
if let Ok(n) = res {
// Safety: the kernel wrote `n` bytes to the buffer.
unsafe {
buf.set_init(n);
}
}
(res, buf)
}
/* old
pub(crate) async fn read(mut self) -> BufResult<usize, T> {
crate::future::poll_fn(move |cx| self.poll_i(cx)).await
}
fn poll_i(&mut self, cx: &mut Context<'_>) -> Poll<BufResult<usize, T>> {
use std::future::Future;
use std::pin::Pin;
let complete = ready!(Pin::new(self).poll(cx));
// Convert the operation result to `usize`
let res = complete.result.map(|v| v as usize);
// Recover the buffer
let mut buf = complete.data.buf;
// If the operation was successful, advance the initialized cursor.
if let Ok(n) = res {
// Safety: the kernel wrote `n` bytes to the buffer.
unsafe {
buf.set_init(n);
}
}
Poll::Ready((res, buf))
}
*/It compiles and runs. Is fewer lines of code, one function instead of three, probably less cpu and less stack. Maybe less heap.
Any other driver operations that followed the earlier model might be easily swapped for this too.
Is anything important being lost with this?
Metadata
Metadata
Assignees
Labels
No labels