From 61f88124234576dd558249a41ec68448e598d280 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Mon, 23 Sep 2024 14:14:17 +0200 Subject: [PATCH] add support of non-blocking system call `accept` --- src/fd/socket/tcp.rs | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/fd/socket/tcp.rs b/src/fd/socket/tcp.rs index 51c4e87c4f..65b8ded172 100644 --- a/src/fd/socket/tcp.rs +++ b/src/fd/socket/tcp.rs @@ -292,16 +292,20 @@ impl Socket { self.with(|socket| match socket.state() { tcp::State::Closed => { let _ = socket.listen(self.port); - Poll::Ready(()) + Poll::Ready(Ok(())) } - tcp::State::Listen | tcp::State::Established => Poll::Ready(()), + tcp::State::Listen | tcp::State::Established => Poll::Ready(Ok(())), _ => { - socket.register_recv_waker(cx.waker()); - Poll::Pending + if self.is_nonblocking { + Poll::Ready(Err(io::Error::EAGAIN)) + } else { + socket.register_recv_waker(cx.waker()); + Poll::Pending + } } }) }) - .await; + .await?; future::poll_fn(|cx| { self.with(|socket| { @@ -314,8 +318,12 @@ impl Socket { | tcp::State::FinWait1 | tcp::State::FinWait2 => Poll::Ready(Err(io::Error::EIO)), _ => { - socket.register_recv_waker(cx.waker()); - Poll::Pending + if self.is_nonblocking { + Poll::Ready(Err(io::Error::EAGAIN)) + } else { + socket.register_recv_waker(cx.waker()); + Poll::Pending + } } } } @@ -491,8 +499,8 @@ impl ObjectInterface for async_lock::RwLock { } async fn accept(&self) -> io::Result<(Arc, Endpoint)> { - let (handle, endpoint) = self.write().await.accept().await?; - Ok((Arc::new(async_lock::RwLock::new(handle)), endpoint)) + let (socket, endpoint) = self.write().await.accept().await?; + Ok((Arc::new(async_lock::RwLock::new(socket)), endpoint)) } async fn getpeername(&self) -> io::Result> {