summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Lucina <mato@kotelna.sk>2010-09-30 15:30:24 +0200
committerMartin Lucina <mato@kotelna.sk>2010-09-30 15:30:24 +0200
commit8f9080ebb9ea5576c87a1412748aef1faf0653f6 (patch)
treecd54701a5410d95bb96c7085edef1d80f9efb5e3
parentac9b05c36b9d1f5bb3f8465b4c56478c399a01f3 (diff)
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.
-rw-r--r--src/zmq.cpp11
1 files changed, 7 insertions, 4 deletions
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