summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/zmq.cpp27
1 files changed, 14 insertions, 13 deletions
diff --git a/src/zmq.cpp b/src/zmq.cpp
index 6870ed9..3ebd8d0 100644
--- a/src/zmq.cpp
+++ b/src/zmq.cpp
@@ -505,32 +505,32 @@ int zmq_poll (zmq_pollitem_t *items_, int nitems_, long timeout_)
// First iteration just check for events, don't block. Waiting would
// prevent exiting on any events that may already been signaled on
// 0MQ sockets.
- int rc = select (maxfd, &pollset_in, &pollset_out, &pollset_err,
- &zero_timeout);
+ fd_set inset, outset, errset;
+ memcpy (&inset, &pollset_in, sizeof (fd_set));
+ memcpy (&outset, &pollset_out, sizeof (fd_set));
+ memcpy (&errset, &pollset_err, sizeof (fd_set));
+ int rc = select (maxfd, &inset, &outset, &errset, &zero_timeout);
#if defined ZMQ_HAVE_WINDOWS
wsa_assert (rc != SOCKET_ERROR);
#else
- if (rc == -1 && errno == EINTR)
- break;
- errno_assert (rc >= 0);
+ errno_assert (rc != -1 || errno != EINTR);
#endif
while (true) {
// Process 0MQ commands if needed.
- if (nsockets && FD_ISSET (notify_fd, &pollset_in))
+ if (nsockets && FD_ISSET (notify_fd, &inset))
app_thread->process_commands (false, false);
// Check for the events.
- int pollfd_pos = 0;
for (int i = 0; i != nitems_; i++) {
// If the poll item is a raw file descriptor, simply convert
// the events to zmq_pollitem_t-style format.
if (!items_ [i].socket) {
items_ [i].revents =
- (FD_ISSET (items_ [i].fd, &pollset_in) ? ZMQ_POLLIN : 0) |
- (FD_ISSET (items_ [i].fd, &pollset_out) ? ZMQ_POLLOUT : 0);
+ (FD_ISSET (items_ [i].fd, &inset) ? ZMQ_POLLIN : 0) |
+ (FD_ISSET (items_ [i].fd, &outset) ? ZMQ_POLLOUT : 0);
if (items_ [i].revents)
nevents++;
continue;
@@ -553,14 +553,15 @@ int zmq_poll (zmq_pollitem_t *items_, int nitems_, long timeout_)
break;
// Wait for events.
- int rc = select (maxfd, &pollset_in, &pollset_out, &pollset_err,
+ memcpy (&inset, &pollset_in, sizeof (fd_set));
+ memcpy (&outset, &pollset_out, sizeof (fd_set));
+ memcpy (&errset, &pollset_err, sizeof (fd_set));
+ int rc = select (maxfd, &inset, &outset, &errset,
block ? NULL : &timeout);
#if defined ZMQ_HAVE_WINDOWS
wsa_assert (rc != SOCKET_ERROR);
#else
- if (rc == -1 && errno == EINTR)
- break;
- errno_assert (rc >= 0);
+ errno_assert (rc != -1 || errno != EINTR);
#endif
// If timeout was hit with no events signaled, return zero.