Skip to content

Commit

Permalink
Problem: memcpy code fragment is duplicated
Browse files Browse the repository at this point in the history
Solution: unify between Windows and non-Windows code
  • Loading branch information
sigiesec committed Jun 1, 2018
1 parent 04dedfb commit 2533ffe
Showing 1 changed file with 9 additions and 10 deletions.
19 changes: 9 additions & 10 deletions src/zmq.cpp
Expand Up @@ -840,13 +840,19 @@ static timeout_t compute_timeout (const bool first_pass_,
std::min<uint64_t> (end_ - now_, INT_MAX));
}
#elif defined ZMQ_POLL_BASED_ON_SELECT
#if defined ZMQ_HAVE_WINDOWS
static size_t valid_pollset_bytes (const fd_set &pollset_)
{
#if defined ZMQ_HAVE_WINDOWS
// On Windows we don't need to copy the whole fd_set.
// SOCKETS are continuous from the beginning of fd_array in fd_set.
// We just need to copy fd_count elements of fd_array.
// We gain huge memcpy() improvement if number of used SOCKETs is much lower than FD_SETSIZE.
return reinterpret_cast<char *> (pollset_.fd_array + pollset_.fd_count)
- reinterpret_cast<char *> (&pollset_);
}
#else
return sizeof (fd_set);
#endif
}
#endif
#endif

Expand Down Expand Up @@ -1035,24 +1041,17 @@ int zmq_poll (zmq_pollitem_t *items_, int nitems_, long timeout_)

// Wait for events. Ignore interrupts if there's infinite timeout.
while (true) {
#if defined ZMQ_HAVE_WINDOWS
// On Windows we don't need to copy the whole fd_set.
// SOCKETS are continuous from the beginning of fd_array in fd_set.
// We just need to copy fd_count elements of fd_array.
// We gain huge memcpy() improvement if number of used SOCKETs is much lower than FD_SETSIZE.
memcpy (&inset, &pollset_in, valid_pollset_bytes (pollset_in));
memcpy (&outset, &pollset_out, valid_pollset_bytes (pollset_out));
memcpy (&errset, &pollset_err, valid_pollset_bytes (pollset_err));
#if defined ZMQ_HAVE_WINDOWS
int rc = select (0, &inset, &outset, &errset, ptimeout);
if (unlikely (rc == SOCKET_ERROR)) {
errno = zmq::wsa_error_to_errno (WSAGetLastError ());
wsa_assert (errno == ENOTSOCK);
return -1;
}
#else
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 + 1, &inset, &outset, &errset, ptimeout);
if (unlikely (rc == -1)) {
errno_assert (errno == EINTR || errno == EBADF);
Expand Down

0 comments on commit 2533ffe

Please sign in to comment.