From 4a2e58074d024d0d43dc71a899b0c465b4379b91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Tue, 29 Oct 2002 05:41:10 +0000 Subject: [PATCH] select_info had the wrong size (uint8 instead of uint16). Corrected POLLNVAL handling. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@1750 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kernel/core/fs/vfs.c | 5 +++++ src/kernel/core/fs/vfs_select.h | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/kernel/core/fs/vfs.c b/src/kernel/core/fs/vfs.c index 35bfb83322..9eda490226 100755 --- a/src/kernel/core/fs/vfs.c +++ b/src/kernel/core/fs/vfs.c @@ -2708,6 +2708,8 @@ common_poll(struct pollfd *fds, nfds_t numfds, bigtime_t timeout, bool kernel) fds[i].revents = POLLNVAL; continue; } + // clear reported events mask + fds[i].revents = 0; if ((fds[i].events & POLLIN) && select_fd(fd, B_SELECT_READ, MAKE_SELECT_REF(fd, B_SELECT_READ), &sync, kernel) == B_OK) @@ -2774,6 +2776,9 @@ common_poll(struct pollfd *fds, nfds_t numfds, bigtime_t timeout, bool kernel) switch (status) { case B_OK: for (count = 0, i = 0;i < numfds; i++) { + if (fds[i].revents == POLLNVAL) + continue; + // POLLxxx flags and B_SELECT_xxx flags are compatible fds[i].revents = sync.set[i].events; if (fds[i].revents != 0) diff --git a/src/kernel/core/fs/vfs_select.h b/src/kernel/core/fs/vfs_select.h index bf6d7bf687..6be0f2e189 100644 --- a/src/kernel/core/fs/vfs_select.h +++ b/src/kernel/core/fs/vfs_select.h @@ -6,7 +6,7 @@ #define VFS_SELECT_H typedef struct select_info { - uint8 events; + uint16 events; } select_info; typedef struct select_sync {