diff --git a/src/executor/network.rs b/src/executor/network.rs index 50b56095dc..3b700a33d8 100644 --- a/src/executor/network.rs +++ b/src/executor/network.rs @@ -334,6 +334,9 @@ where // be sure that we are not interrupted by a timer, which is able // to call `reschedule` without_interrupts(|| { + // avoid network interrupts + get_network_driver().unwrap().lock().set_polling_mode(true); + let start = now(); let waker = core::task::Waker::noop(); let mut cx = Context::from_waker(&waker); @@ -349,6 +352,9 @@ where .map(|d| crate::arch::processor::get_timer_ticks() + d.total_micros()); core_scheduler().add_network_timer(wakeup_time); + // allow network interrupts + get_network_driver().unwrap().lock().set_polling_mode(false); + return t; } @@ -358,6 +364,9 @@ where .map(|d| crate::arch::processor::get_timer_ticks() + d.total_micros()); core_scheduler().add_network_timer(wakeup_time); + // allow network interrupts + get_network_driver().unwrap().lock().set_polling_mode(false); + return Err(-crate::errno::ETIME); } } diff --git a/src/fd/socket/tcp.rs b/src/fd/socket/tcp.rs index d9ab7f6963..9fbefe1153 100644 --- a/src/fd/socket/tcp.rs +++ b/src/fd/socket/tcp.rs @@ -69,8 +69,10 @@ impl Socket { async fn async_read(&self, buffer: &mut [u8]) -> Result { future::poll_fn(|cx| { self.with(|socket| { - if socket.can_recv() { - return Poll::Ready( + if !socket.is_active() { + Poll::Ready(Err(-crate::errno::EIO)) + } else if socket.can_recv() { + Poll::Ready( socket .recv(|data| { let len = core::cmp::min(buffer.len(), data.len()); @@ -78,25 +80,10 @@ impl Socket { (len, isize::try_from(len).unwrap()) }) .map_err(|_| -crate::errno::EIO), - ); - } - - match socket.state() { - tcp::State::FinWait1 - | tcp::State::FinWait2 - | tcp::State::Closed - | tcp::State::Closing - | tcp::State::CloseWait - | tcp::State::TimeWait => Poll::Ready(Err(-crate::errno::EIO)), - _ => { - if socket.can_recv() { - warn!("async_read: Unable to consume data"); - Poll::Ready(Ok(0)) - } else { - socket.register_recv_waker(cx.waker()); - Poll::Pending - } - } + ) + } else { + socket.register_recv_waker(cx.waker()); + Poll::Pending } }) }) @@ -109,36 +96,21 @@ impl Socket { while pos < buffer.len() { let n = future::poll_fn(|cx| { self.with(|socket| { - if socket.can_send() { - return Poll::Ready( + if !socket.is_active() { + Poll::Ready(Err(-crate::errno::EIO)) + } else if socket.can_send() { + Poll::Ready( socket .send_slice(&buffer[pos..]) .map_err(|_| -crate::errno::EIO), - ); - } - - if pos > 0 { + ) + } else if pos > 0 { // we already send some data => return 0 as signal to stop the // async write - return Poll::Ready(Ok(0)); - } - - match socket.state() { - tcp::State::FinWait1 - | tcp::State::FinWait2 - | tcp::State::Closed - | tcp::State::Closing - | tcp::State::CloseWait - | tcp::State::TimeWait => Poll::Ready(Err(-crate::errno::EIO)), - _ => { - if socket.can_send() { - warn!("async_write: Unable to consume data"); - Poll::Ready(Ok(0)) - } else { - socket.register_send_waker(cx.waker()); - Poll::Pending - } - } + Poll::Ready(Ok(0)) + } else { + socket.register_send_waker(cx.waker()); + Poll::Pending } }) })