diff --git a/services/libs/jinux-std/src/device/pty/pty.rs b/services/libs/jinux-std/src/device/pty/pty.rs index e2829a8f9..292333b23 100644 --- a/services/libs/jinux-std/src/device/pty/pty.rs +++ b/services/libs/jinux-std/src/device/pty/pty.rs @@ -105,7 +105,8 @@ impl FileLike for PtyMaster { if events.is_empty() { drop(input); - poller.wait(); + // FIXME: deal with pty read timeout + poller.wait(None)?; } continue; } diff --git a/services/libs/jinux-std/src/device/tty/line_discipline.rs b/services/libs/jinux-std/src/device/tty/line_discipline.rs index c2106601a..81d9f997a 100644 --- a/services/libs/jinux-std/src/device/tty/line_discipline.rs +++ b/services/libs/jinux-std/src/device/tty/line_discipline.rs @@ -252,7 +252,8 @@ impl LineDiscipline { }; let revents = self.pollee.poll(IoEvents::IN, need_poller); if revents.is_empty() { - poller.as_ref().unwrap().wait(); + // FIXME: deal with ldisc read timeout + poller.as_ref().unwrap().wait(None)?; } } } diff --git a/services/libs/jinux-std/src/fs/epoll/epoll_file.rs b/services/libs/jinux-std/src/fs/epoll/epoll_file.rs index b1e7fd975..ca4b712fa 100644 --- a/services/libs/jinux-std/src/fs/epoll/epoll_file.rs +++ b/services/libs/jinux-std/src/fs/epoll/epoll_file.rs @@ -191,8 +191,7 @@ impl EpollFile { } } - // FIXME: respect timeout parameter - poller.as_ref().unwrap().wait(); + poller.as_ref().unwrap().wait(timeout)?; } } diff --git a/services/libs/jinux-std/src/fs/utils/channel.rs b/services/libs/jinux-std/src/fs/utils/channel.rs index d3449aabe..7d1d0e759 100644 --- a/services/libs/jinux-std/src/fs/utils/channel.rs +++ b/services/libs/jinux-std/src/fs/utils/channel.rs @@ -152,7 +152,8 @@ impl Producer { } let events = self.poll(mask, Some(&poller)); if events.is_empty() { - poller.wait(); + // FIXME: should channel deal with timeout? + poller.wait(None)?; } } } @@ -240,7 +241,8 @@ impl Consumer { } let events = self.poll(mask, Some(&poller)); if events.is_empty() { - poller.wait(); + // FIXME: should channel have timeout? + poller.wait(None)?; } } } diff --git a/services/libs/jinux-std/src/fs/utils/poll.rs b/services/libs/jinux-std/src/fs/utils/poll.rs index ead309b47..639b9a763 100644 --- a/services/libs/jinux-std/src/fs/utils/poll.rs +++ b/services/libs/jinux-std/src/fs/utils/poll.rs @@ -3,6 +3,7 @@ use crate::events::{Observer, Subject}; use crate::prelude::*; use core::sync::atomic::{AtomicU32, AtomicUsize, Ordering}; +use core::time::Duration; use jinux_frame::sync::WaitQueue; use keyable_arc::KeyableWeak; @@ -157,8 +158,9 @@ impl Poller { } /// Wait until there are any interesting events happen since last `wait`. - pub fn wait(&self) { - self.inner.event_counter.read(); + pub fn wait(&self, timeout: Option<&Duration>) -> Result<()> { + self.inner.event_counter.read(timeout)?; + Ok(()) } fn observer(&self) -> Weak> { @@ -202,20 +204,19 @@ impl EventCounter { } } - pub fn read(&self) -> usize { - self.wait_queue - .wait_until( - || { - let val = self.counter.swap(0, Ordering::Relaxed); - if val > 0 { - Some(val) - } else { - None - } - }, - None, - ) - .unwrap() + pub fn read(&self, timeout: Option<&Duration>) -> Result { + let val = self.wait_queue.wait_until( + || { + let val = self.counter.swap(0, Ordering::Relaxed); + if val > 0 { + Some(val) + } else { + None + } + }, + timeout, + )?; + Ok(val) } pub fn write(&self) { diff --git a/services/libs/jinux-std/src/net/socket/ip/datagram.rs b/services/libs/jinux-std/src/net/socket/ip/datagram.rs index 308c41139..73f4fa11d 100644 --- a/services/libs/jinux-std/src/net/socket/ip/datagram.rs +++ b/services/libs/jinux-std/src/net/socket/ip/datagram.rs @@ -258,7 +258,8 @@ impl Socket for DatagramSocket { if self.nonblocking() { return_errno_with_message!(Errno::EAGAIN, "try to receive again"); } - poller.wait(); + // FIXME: deal with recvfrom timeout + poller.wait(None)?; } } } diff --git a/services/libs/jinux-std/src/net/socket/ip/stream/connected.rs b/services/libs/jinux-std/src/net/socket/ip/stream/connected.rs index 858796cbe..3a17de07a 100644 --- a/services/libs/jinux-std/src/net/socket/ip/stream/connected.rs +++ b/services/libs/jinux-std/src/net/socket/ip/stream/connected.rs @@ -57,7 +57,8 @@ impl ConnectedStream { if self.is_nonblocking() { return_errno_with_message!(Errno::EAGAIN, "try to recv again"); } - poller.wait(); + // FIXME: deal with receive timeout + poller.wait(None)?; } } } diff --git a/services/libs/jinux-std/src/net/socket/ip/stream/init.rs b/services/libs/jinux-std/src/net/socket/ip/stream/init.rs index b38c64475..447c1e6ec 100644 --- a/services/libs/jinux-std/src/net/socket/ip/stream/init.rs +++ b/services/libs/jinux-std/src/net/socket/ip/stream/init.rs @@ -151,7 +151,8 @@ impl InitStream { } else if self.is_nonblocking() { return_errno_with_message!(Errno::EAGAIN, "try connect again"); } else { - poller.wait(); + // FIXME: deal with connecting timeout + poller.wait(None)?; } } } diff --git a/services/libs/jinux-std/src/net/socket/ip/stream/listen.rs b/services/libs/jinux-std/src/net/socket/ip/stream/listen.rs index aa68bb680..e4633a9af 100644 --- a/services/libs/jinux-std/src/net/socket/ip/stream/listen.rs +++ b/services/libs/jinux-std/src/net/socket/ip/stream/listen.rs @@ -45,7 +45,8 @@ impl ListenStream { if self.is_nonblocking() { return_errno_with_message!(Errno::EAGAIN, "try accept again"); } - poller.wait(); + // FIXME: deal with accept timeout + poller.wait(None)?; } continue; }; diff --git a/services/libs/jinux-std/src/net/socket/unix/stream/listener.rs b/services/libs/jinux-std/src/net/socket/unix/stream/listener.rs index 8af27adea..991a37efe 100644 --- a/services/libs/jinux-std/src/net/socket/unix/stream/listener.rs +++ b/services/libs/jinux-std/src/net/socket/unix/stream/listener.rs @@ -131,8 +131,9 @@ impl BacklogTable { return_errno_with_message!(Errno::ECONNABORTED, "connection is aborted"); } + // FIXME: deal with accept timeout if events.is_empty() { - poller.wait(); + poller.wait(None)?; } } } diff --git a/services/libs/jinux-std/src/syscall/poll.rs b/services/libs/jinux-std/src/syscall/poll.rs index 1bbdf3cb5..5a719c1cc 100644 --- a/services/libs/jinux-std/src/syscall/poll.rs +++ b/services/libs/jinux-std/src/syscall/poll.rs @@ -91,8 +91,7 @@ pub fn do_poll(poll_fds: &[PollFd], timeout: Option) -> Result return Ok(0); } - // FIXME: respect timeout parameter - poller.wait(); + poller.wait(timeout.as_ref())?; } }