From 0417ad73760b16abb6f09cb807a3b4cf449d9d41 Mon Sep 17 00:00:00 2001 From: Yuke Peng Date: Tue, 16 Jul 2024 14:50:10 +0800 Subject: [PATCH] Ignore timeout error in epoll_wait --- kernel/aster-nix/src/syscall/epoll.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/kernel/aster-nix/src/syscall/epoll.rs b/kernel/aster-nix/src/syscall/epoll.rs index 8ea5f788b..39868a9a8 100644 --- a/kernel/aster-nix/src/syscall/epoll.rs +++ b/kernel/aster-nix/src/syscall/epoll.rs @@ -109,9 +109,19 @@ fn do_epoll_wait(epfd: FileDesc, max_events: i32, timeout: i32) -> Result() .ok_or(Error::with_message(Errno::EINVAL, "not epoll file"))?; - let epoll_events = epoll_file.wait(max_events, timeout.as_ref())?; + let result = epoll_file.wait(max_events, timeout.as_ref()); - Ok(epoll_events) + // As mentioned in the manual, the return value should be zero if no file descriptor becomes ready + // during the requested `timeout` milliseconds. So we ignore `Err(ETIME)` and return an empty vector. + // + // Manual: + if result + .as_ref() + .is_err_and(|err| err.error() == Errno::ETIME) + { + return Ok(Vec::new()); + } + result } pub fn sys_epoll_wait(