concurrent read write loop working

relies on timeouts. Write to Networks doesn't work yet
This commit is contained in:
Jett Chen 2023-11-28 22:05:31 +08:00
parent 6c1c806401
commit 4038d125db
7 changed files with 121 additions and 51 deletions

View file

@ -27,14 +27,38 @@ impl TunInterface {
}
}
#[instrument]
// #[instrument]
pub async fn recv(&mut self, buf: &mut [u8]) -> io::Result<usize> {
loop {
log::debug!("TunInterface receiving...");
let mut guard = self.inner.readable_mut().await?;
match guard.try_io(|inner| (*inner).get_mut().recv(buf)) {
Ok(result) => return result,
Err(_would_block) => continue,
log::debug!("Got! readable_mut");
match guard.try_io(|inner| {
// log::debug!("Got! {:#?}", inner);
let raw_ref = (*inner).get_mut();
// log::debug!("Got mut ref! {:#?}", raw_ref);
let recved = raw_ref.recv(buf);
// log::debug!("Got recved! {:#?}", recved);
recved
}) {
Ok(result) => {
log::debug!("HORRAY");
return result
},
Err(_would_block) => {
log::debug!("WouldBlock");
continue
},
}
}
}
#[instrument]
pub async fn try_recv(&mut self, buf: &mut [u8]) -> io::Result<usize> {
let mut guard = self.inner.readable_mut().await?;
match guard.try_io(|inner| (*inner).get_mut().recv(buf)) {
Ok(result) => Ok(result.unwrap_or_default()),
Err(_would_block) => Err(io::Error::new(io::ErrorKind::WouldBlock, "WouldBlock")),
}
}
}

View file

@ -50,6 +50,12 @@ impl TunInterface {
buf[..len-4].copy_from_slice(&tmp_buf[4..len]);
len-4
}
#[throws]
#[instrument]
pub fn set_timeout(&self, timeout: Option<std::time::Duration>) {
self.socket.set_read_timeout(timeout)?;
}
}
#[instrument]