poll: Prevent libevent from spinning if POLLNVAL occurs

This can happen, for example if libevent is being used to poll fds given
by another library where the other library closes the fds without
notifying the program using it that said fds were closed. In this case,
libevent will simply spin on poll() since there are active fds, but
won't call any event callback to handle the condition.

In epoll case after socket closed it automatically removed from epfd, so
IOW it will not spin in epoll* API, just a timeout.

Fixes: #379
This commit is contained in:
Tim Hentenaar 2016-07-14 15:45:01 +02:00 committed by Azat Khuzhin
parent 9ac000c724
commit 675974ce30

2
poll.c
View File

@ -198,7 +198,7 @@ poll_dispatch(struct event_base *base, struct timeval *tv)
res = 0;
/* If the file gets closed notify */
if (what & (POLLHUP|POLLERR))
if (what & (POLLHUP|POLLERR|POLLNVAL))
what |= POLLIN|POLLOUT;
if (what & POLLIN)
res |= EV_READ;