socket_poller::wait returns only triggered events

Return value is the number of events found. This also propagates to the return value of zmq_poller_wait_all.

zmq_poller_wait was only returning events on the first-registered socket.
This commit is contained in:
Min RK
2016-09-29 15:08:10 +02:00
parent 872f1e5a9d
commit 718608ce94
2 changed files with 57 additions and 35 deletions

View File

@@ -412,7 +412,6 @@ int zmq::socket_poller_t::wait (zmq::socket_poller_t::event_t *events_, int n_ev
uint64_t end = 0;
bool first_pass = true;
bool found = false;
while (true) {
// Compute the timeout for the subsequent poll.
@@ -440,13 +439,13 @@ int zmq::socket_poller_t::wait (zmq::socket_poller_t::event_t *events_, int n_ev
signaler.recv ();
// Check for the events.
int i = 0;
for (items_t::iterator it = items.begin (); it != items.end () && i < n_events_; ++i, ++it) {
int found = 0;
for (items_t::iterator it = items.begin (); it != items.end () && found < n_events_; ++it) {
events_[i].socket = NULL;
events_[i].fd = 0;
events_[i].user_data = NULL;
events_[i].events = 0;
events_[found].socket = NULL;
events_[found].fd = 0;
events_[found].user_data = NULL;
events_[found].events = 0;
// The poll item is a 0MQ socket. Retrieve pending events
// using the ZMQ_EVENTS socket option.
@@ -458,10 +457,10 @@ int zmq::socket_poller_t::wait (zmq::socket_poller_t::event_t *events_, int n_ev
}
if (it->events & events) {
events_[i].socket = it->socket;
events_[i].user_data = it->user_data;
events_[i].events = it->events & events;
found = true;
events_[found].socket = it->socket;
events_[found].user_data = it->user_data;
events_[found].events = it->events & events;
++found;
}
}
// Else, the poll item is a raw file descriptor, simply convert
@@ -480,16 +479,22 @@ int zmq::socket_poller_t::wait (zmq::socket_poller_t::event_t *events_, int n_ev
events |= ZMQ_POLLERR;
if (events) {
events_[i].socket = NULL;
events_[i].user_data = it->user_data;
events_[i].fd = it->fd;
events_[i].events = events;
found = true;
events_[found].socket = NULL;
events_[found].user_data = it->user_data;
events_[found].fd = it->fd;
events_[found].events = events;
++found;
}
}
}
if (found) {
return 0;
for (int i = found; i < n_events_; ++i) {
events_[i].socket = NULL;
events_[i].fd = 0;
events_[i].user_data = NULL;
events_[i].events = 0;
}
return found;
}
// If timeout is zero, exit immediately whether there are events or not.
@@ -548,7 +553,6 @@ int zmq::socket_poller_t::wait (zmq::socket_poller_t::event_t *events_, int n_ev
uint64_t end = 0;
bool first_pass = true;
bool found = false;
fd_set inset, outset, errset;
while (true) {
@@ -596,8 +600,8 @@ int zmq::socket_poller_t::wait (zmq::socket_poller_t::event_t *events_, int n_ev
signaler.recv ();
// Check for the events.
int i = 0;
for (items_t::iterator it = items.begin (); it != items.end () && i < n_events_; ++i, ++it) {
int found = 0;
for (items_t::iterator it = items.begin (); it != items.end () && found < n_events_; ++it) {
// The poll item is a 0MQ socket. Retrieve pending events
// using the ZMQ_EVENTS socket option.
@@ -608,10 +612,10 @@ int zmq::socket_poller_t::wait (zmq::socket_poller_t::event_t *events_, int n_ev
return -1;
if (it->events & events) {
events_[i].socket = it->socket;
events_[i].user_data = it->user_data;
events_[i].events = it->events & events;
found = true;
events_[found].socket = it->socket;
events_[found].user_data = it->user_data;
events_[found].events = it->events & events;
++found;
}
}
// Else, the poll item is a raw file descriptor, simply convert
@@ -627,16 +631,23 @@ int zmq::socket_poller_t::wait (zmq::socket_poller_t::event_t *events_, int n_ev
events |= ZMQ_POLLERR;
if (events) {
events_[i].socket = NULL;
events_[i].user_data = it->user_data;
events_[i].fd = it->fd;
events_[i].events = events;
found = true;
events_[found].socket = NULL;
events_[found].user_data = it->user_data;
events_[found].fd = it->fd;
events_[found].events = events;
++found;
}
}
}
if (found) {
return 0;
// zero-out remaining events
for (int i = found; i < n_events_; ++i) {
events_[i].socket = NULL;
events_[i].fd = 0;
events_[i].user_data = NULL;
events_[i].events = 0;
}
return found;
}
// If timeout is zero, exit immediately whether there are events or not.