Commit 56faac7f authored by Martin Sustrik's avatar Martin Sustrik

zmq_poll returns prematurely even if infinite timeout is set - fixed

parent 3cb84b5c
...@@ -375,6 +375,7 @@ int zmq_poll (zmq_pollitem_t *items_, int nitems_, long timeout_) ...@@ -375,6 +375,7 @@ int zmq_poll (zmq_pollitem_t *items_, int nitems_, long timeout_)
errno = EFAULT; errno = EFAULT;
return -1; return -1;
} }
pollfd *pollfds = (pollfd*) malloc (nitems_ * sizeof (pollfd)); pollfd *pollfds = (pollfd*) malloc (nitems_ * sizeof (pollfd));
zmq_assert (pollfds); zmq_assert (pollfds);
...@@ -405,6 +406,8 @@ int zmq_poll (zmq_pollitem_t *items_, int nitems_, long timeout_) ...@@ -405,6 +406,8 @@ int zmq_poll (zmq_pollitem_t *items_, int nitems_, long timeout_)
int timeout = timeout_ > 0 ? timeout_ / 1000 : -1; int timeout = timeout_ > 0 ? timeout_ / 1000 : -1;
int nevents = 0; int nevents = 0;
while (true) {
// Wait for events. Ignore interrupts if there's infinite timeout. // Wait for events. Ignore interrupts if there's infinite timeout.
while (true) { while (true) {
int rc = poll (pollfds, nitems_, timeout); int rc = poll (pollfds, nitems_, timeout);
...@@ -436,9 +439,11 @@ int zmq_poll (zmq_pollitem_t *items_, int nitems_, long timeout_) ...@@ -436,9 +439,11 @@ int zmq_poll (zmq_pollitem_t *items_, int nitems_, long timeout_)
free (pollfds); free (pollfds);
return -1; return -1;
} }
if ((items_ [i].events & ZMQ_POLLOUT) && (zmq_events & ZMQ_POLLOUT)) if ((items_ [i].events & ZMQ_POLLOUT) &&
(zmq_events & ZMQ_POLLOUT))
items_ [i].revents |= ZMQ_POLLOUT; items_ [i].revents |= ZMQ_POLLOUT;
if ((items_ [i].events & ZMQ_POLLIN) && (zmq_events & ZMQ_POLLIN)) if ((items_ [i].events & ZMQ_POLLIN) &&
(zmq_events & ZMQ_POLLIN))
items_ [i].revents |= ZMQ_POLLIN; items_ [i].revents |= ZMQ_POLLIN;
} }
// Else, the poll item is a raw file descriptor, simply convert // Else, the poll item is a raw file descriptor, simply convert
...@@ -456,6 +461,14 @@ int zmq_poll (zmq_pollitem_t *items_, int nitems_, long timeout_) ...@@ -456,6 +461,14 @@ int zmq_poll (zmq_pollitem_t *items_, int nitems_, long timeout_)
nevents++; nevents++;
} }
// If timeout is set to infinite and we have to events to return
// we can restart the polling.
if (timeout == -1 && nevents == 0)
continue;
break;
}
free (pollfds); free (pollfds);
return nevents; return nevents;
...@@ -505,6 +518,8 @@ int zmq_poll (zmq_pollitem_t *items_, int nitems_, long timeout_) ...@@ -505,6 +518,8 @@ int zmq_poll (zmq_pollitem_t *items_, int nitems_, long timeout_)
int nevents = 0; int nevents = 0;
fd_set inset, outset, errset; fd_set inset, outset, errset;
while (true) {
// Wait for events. Ignore interrupts if there's infinite timeout. // Wait for events. Ignore interrupts if there's infinite timeout.
while (true) { while (true) {
memcpy (&inset, &pollset_in, sizeof (fd_set)); memcpy (&inset, &pollset_in, sizeof (fd_set));
...@@ -569,9 +584,18 @@ int zmq_poll (zmq_pollitem_t *items_, int nitems_, long timeout_) ...@@ -569,9 +584,18 @@ int zmq_poll (zmq_pollitem_t *items_, int nitems_, long timeout_)
nevents++; nevents++;
} }
// If timeout is set to infinite and we have to events to return
// we can restart the polling.
if (timeout_ < 0 && nevents == 0)
continue;
break;
}
return nevents; return nevents;
#else #else
// Exotic platforms that support neither poll() nor select().
errno = ENOTSUP; errno = ENOTSUP;
return -1; return -1;
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment