diff options
author | Brad King <brad.king@kitware.com> | 2018-05-07 15:48:01 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2018-05-07 15:48:01 (GMT) |
commit | 42fbb285161a7424116a1e838b29741864ab3691 (patch) | |
tree | 858d1d7aa84098ce326d32c41da9047d9cd95064 /Utilities/cmlibuv/src/unix/posix-poll.c | |
parent | dd3e1a737216b7c9bfb6c7569685b36a1bff9cba (diff) | |
parent | c8b67ea119c4000018238f6c3201a1364356d93a (diff) | |
download | CMake-42fbb285161a7424116a1e838b29741864ab3691.zip CMake-42fbb285161a7424116a1e838b29741864ab3691.tar.gz CMake-42fbb285161a7424116a1e838b29741864ab3691.tar.bz2 |
Merge branch 'upstream-libuv' into update-libuv
* upstream-libuv:
libuv 2018-05-06 (bf605bd7)
Diffstat (limited to 'Utilities/cmlibuv/src/unix/posix-poll.c')
-rw-r--r-- | Utilities/cmlibuv/src/unix/posix-poll.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/Utilities/cmlibuv/src/unix/posix-poll.c b/Utilities/cmlibuv/src/unix/posix-poll.c index 3fba96e..f3181f9 100644 --- a/Utilities/cmlibuv/src/unix/posix-poll.c +++ b/Utilities/cmlibuv/src/unix/posix-poll.c @@ -107,7 +107,7 @@ static void uv__pollfds_add(uv_loop_t* loop, uv__io_t* w) { static void uv__pollfds_del(uv_loop_t* loop, int fd) { size_t i; assert(!loop->poll_fds_iterating); - for (i = 0; i < loop->poll_fds_used; ++i) { + for (i = 0; i < loop->poll_fds_used;) { if (loop->poll_fds[i].fd == fd) { /* swap to last position and remove */ --loop->poll_fds_used; @@ -115,7 +115,17 @@ static void uv__pollfds_del(uv_loop_t* loop, int fd) { loop->poll_fds[loop->poll_fds_used].fd = -1; loop->poll_fds[loop->poll_fds_used].events = 0; loop->poll_fds[loop->poll_fds_used].revents = 0; - return; + /* This method is called with an fd of -1 to purge the invalidated fds, + * so we may possibly have multiples to remove. + */ + if (-1 != fd) + return; + } else { + /* We must only increment the loop counter when the fds do not match. + * Otherwise, when we are purging an invalidated fd, the value just + * swapped here from the previous end of the array will be skipped. + */ + ++i; } } } @@ -315,10 +325,10 @@ int uv__io_check_fd(uv_loop_t* loop, int fd) { while (rv == -1 && (errno == EINTR || errno == EAGAIN)); if (rv == -1) - return -errno; + return UV__ERR(errno); if (p[0].revents & POLLNVAL) - return -EINVAL; + return UV_EINVAL; return 0; } |