From 8f9080ebb9ea5576c87a1412748aef1faf0653f6 Mon Sep 17 00:00:00 2001 From: Martin Lucina Date: Thu, 30 Sep 2010 15:30:24 +0200 Subject: zmq_poll(): Fix busy-loop if timeout is zero Fix a case where zmq_poll() (poll-based version) could go off into a busy-loop if no revents are returned and the timeout passed in is zero. --- src/zmq.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/zmq.cpp b/src/zmq.cpp index 306a85d..6818605 100644 --- a/src/zmq.cpp +++ b/src/zmq.cpp @@ -412,14 +412,17 @@ int zmq_poll (zmq_pollitem_t *items_, int nitems_, long timeout_) } bool first_pass = true; - int timeout = timeout_ > 0 ? timeout_ / 1000 : -1; int nevents = 0; + if (timeout_ >= 0) + timeout_ /= 1000; + else + timeout_ = -1; while (true) { // Wait for events. while (true) { - int rc = poll (pollfds, nitems_, first_pass ? 0 : timeout); + int rc = poll (pollfds, nitems_, first_pass ? 0 : timeout_); if (rc == -1 && errno == EINTR) { free (pollfds); return -1; @@ -466,7 +469,7 @@ int zmq_poll (zmq_pollitem_t *items_, int nitems_, long timeout_) } // If there are no events from the first pass (the one with no - // timout), do at least the second pass so that we wait. + // timeout), do at least the second pass so that we wait. if (first_pass && nevents == 0 && timeout_ != 0) { first_pass = false; continue; @@ -474,7 +477,7 @@ int zmq_poll (zmq_pollitem_t *items_, int nitems_, long timeout_) // If timeout is set to infinite and we have to events to return // we can restart the polling. - if (timeout == -1 && nevents == 0) + if (timeout_ == -1 && nevents == 0) continue; // TODO: if nevents is zero recompute timeout and loop -- cgit v1.2.3