diff --git a/tests/sys/fs/fusefs/mockfs.cc b/tests/sys/fs/fusefs/mockfs.cc index 053fff399e59..8a69a84711c2 100644 --- a/tests/sys/fs/fusefs/mockfs.cc +++ b/tests/sys/fs/fusefs/mockfs.cc @@ -500,23 +500,31 @@ void MockFS::process_default(const mockfs_buf_in *in, void MockFS::read_request(mockfs_buf_in *in) { ssize_t res; - int nready; + int nready = 0; fd_set readfds; pollfd fds[1]; struct kevent changes[1]; struct kevent events[1]; - int nfds; + struct timespec timeout_ts; + struct timeval timeout_tv; + const int timeout_ms = 999; + int timeout_int, nfds; switch (m_pm) { case BLOCKING: break; case KQ: - EV_SET(&changes[0], m_fuse_fd, EVFILT_READ, EV_ADD, 0, 0, 0); - nready = kevent(m_kq, &changes[0], 1, &events[0], 1, NULL); - if (m_quit) - return; + timeout_ts.tv_sec = 0; + timeout_ts.tv_nsec = timeout_ms * 1'000'000; + while (nready == 0) { + EV_SET(&changes[0], m_fuse_fd, EVFILT_READ, EV_ADD, 0, + 0, 0); + nready = kevent(m_kq, &changes[0], 1, &events[0], 1, + &timeout_ts); + if (m_quit) + return; + } ASSERT_LE(0, nready) << strerror(errno); - ASSERT_EQ(1, nready) << "NULL timeout expired?"; ASSERT_EQ(events[0].ident, (uintptr_t)m_fuse_fd); if (events[0].flags & EV_ERROR) FAIL() << strerror(events[0].data); @@ -525,24 +533,30 @@ void MockFS::read_request(mockfs_buf_in *in) { m_nready = events[0].data; break; case POLL: + timeout_int = timeout_ms; fds[0].fd = m_fuse_fd; fds[0].events = POLLIN; - nready = poll(fds, 1, INFTIM); - if (m_quit) - return; + while (nready == 0) { + nready = poll(fds, 1, timeout_int); + if (m_quit) + return; + } ASSERT_LE(0, nready) << strerror(errno); - ASSERT_EQ(1, nready) << "NULL timeout expired?"; ASSERT_TRUE(fds[0].revents & POLLIN); break; case SELECT: - FD_ZERO(&readfds); - FD_SET(m_fuse_fd, &readfds); + timeout_tv.tv_sec = 0; + timeout_tv.tv_usec = timeout_ms * 1'000; nfds = m_fuse_fd + 1; - nready = select(nfds, &readfds, NULL, NULL, NULL); - if (m_quit) - return; + while (nready == 0) { + FD_ZERO(&readfds); + FD_SET(m_fuse_fd, &readfds); + nready = select(nfds, &readfds, NULL, NULL, + &timeout_tv); + if (m_quit) + return; + } ASSERT_LE(0, nready) << strerror(errno); - ASSERT_EQ(1, nready) << "NULL timeout expired?"; ASSERT_TRUE(FD_ISSET(m_fuse_fd, &readfds)); break; default: