Skip to content

Commit

Permalink
Merge pull request #1628 from hintjens/master
Browse files Browse the repository at this point in the history
Fix for #1399
  • Loading branch information
c-rack committed Nov 1, 2015
2 parents ab2c009 + ba1515f commit ac46e6d
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 35 deletions.
31 changes: 13 additions & 18 deletions src/signaler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -100,20 +100,15 @@ static int close_wait_ms (int fd_, unsigned int max_ms_ = 2000)
unsigned int step_ms = max_ms_ / 10;
if (step_ms < 1)
step_ms = 1;

if (step_ms > 100)
step_ms = 100;

int rc = 0; // do not sleep on first attempt

do
{
if (rc == -1 && errno == EAGAIN)
{
do {
if (rc == -1 && errno == EAGAIN) {
sleep_ms (step_ms);
ms_so_far += step_ms;
}

rc = close (fd_);
} while (ms_so_far < max_ms_ && rc == -1 && errno == EAGAIN);

Expand Down Expand Up @@ -187,7 +182,7 @@ void zmq::signaler_t::send ()
errno_assert (sz == sizeof (inc));
#elif defined ZMQ_HAVE_WINDOWS
unsigned char dummy = 0;
int nbytes = ::send (w, (char*) &dummy, sizeof (dummy), 0);
int nbytes = ::send (w, (char *) &dummy, sizeof (dummy), 0);
wsa_assert (nbytes != SOCKET_ERROR);
zmq_assert (nbytes == sizeof (dummy));
#else
Expand Down Expand Up @@ -304,7 +299,7 @@ void zmq::signaler_t::recv ()
#else
unsigned char dummy;
#if defined ZMQ_HAVE_WINDOWS
int nbytes = ::recv (r, (char*) &dummy, sizeof (dummy), 0);
int nbytes = ::recv (r, (char *) &dummy, sizeof (dummy), 0);
wsa_assert (nbytes != SOCKET_ERROR);
#else
ssize_t nbytes = ::recv (r, &dummy, sizeof (dummy), 0);
Expand Down Expand Up @@ -342,7 +337,7 @@ int zmq::signaler_t::recv_failable ()
#else
unsigned char dummy;
#if defined ZMQ_HAVE_WINDOWS
int nbytes = ::recv (r, (char*) &dummy, sizeof (dummy), 0);
int nbytes = ::recv (r, (char *) &dummy, sizeof (dummy), 0);
if (nbytes == SOCKET_ERROR) {
const int last_error = WSAGetLastError();
if (last_error == WSAEWOULDBLOCK) {
Expand Down Expand Up @@ -466,11 +461,11 @@ int zmq::signaler_t::make_fdpair (fd_t *r_, fd_t *w_)
// Set SO_REUSEADDR and TCP_NODELAY on listening socket.
BOOL so_reuseaddr = 1;
int rc = setsockopt (listener, SOL_SOCKET, SO_REUSEADDR,
(char *)&so_reuseaddr, sizeof so_reuseaddr);
(char *) &so_reuseaddr, sizeof so_reuseaddr);
wsa_assert (rc != SOCKET_ERROR);
BOOL tcp_nodelay = 1;
rc = setsockopt (listener, IPPROTO_TCP, TCP_NODELAY,
(char *)&tcp_nodelay, sizeof tcp_nodelay);
(char *) &tcp_nodelay, sizeof tcp_nodelay);
wsa_assert (rc != SOCKET_ERROR);

// Init sockaddr to signaler port.
Expand All @@ -496,12 +491,12 @@ int zmq::signaler_t::make_fdpair (fd_t *r_, fd_t *w_)
}

// Bind listening socket to signaler port.
rc = bind (listener, (const struct sockaddr*) &addr, sizeof addr);
rc = bind (listener, (const struct sockaddr *) &addr, sizeof addr);

if (rc != SOCKET_ERROR && signaler_port == 0) {
// Retrieve ephemeral port number
int addrlen = sizeof addr;
rc = getsockname (listener, (struct sockaddr*) &addr, &addrlen);
rc = getsockname (listener, (struct sockaddr *) &addr, &addrlen);
}

// Listen for incoming connections.
Expand All @@ -510,7 +505,7 @@ int zmq::signaler_t::make_fdpair (fd_t *r_, fd_t *w_)

// Connect writer to the listener.
if (rc != SOCKET_ERROR)
rc = connect (*w_, (struct sockaddr*) &addr, sizeof addr);
rc = connect (*w_, (struct sockaddr *) &addr, sizeof addr);

// Accept connection from writer.
if (rc != SOCKET_ERROR)
Expand Down Expand Up @@ -582,12 +577,12 @@ int zmq::signaler_t::make_fdpair (fd_t *r_, fd_t *w_)
rc = setsockopt (listener, IPPROTO_TCP, TCP_NODELACK, &on, sizeof on);
errno_assert (rc != -1);

rc = bind (listener, (struct sockaddr*) &lcladdr, sizeof lcladdr);
rc = bind (listener, (struct sockaddr *) &lcladdr, sizeof lcladdr);
errno_assert (rc != -1);

socklen_t lcladdr_len = sizeof lcladdr;

rc = getsockname (listener, (struct sockaddr*) &lcladdr, &lcladdr_len);
rc = getsockname (listener, (struct sockaddr *) &lcladdr, &lcladdr_len);
errno_assert (rc != -1);

rc = listen (listener, 1);
Expand All @@ -602,7 +597,7 @@ int zmq::signaler_t::make_fdpair (fd_t *r_, fd_t *w_)
rc = setsockopt (*w_, IPPROTO_TCP, TCP_NODELACK, &on, sizeof on);
errno_assert (rc != -1);

rc = connect (*w_, (struct sockaddr*) &lcladdr, sizeof lcladdr);
rc = connect (*w_, (struct sockaddr *) &lcladdr, sizeof lcladdr);
errno_assert (rc != -1);

*r_ = accept (listener, NULL, NULL);
Expand Down
32 changes: 15 additions & 17 deletions src/tcp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,6 @@ void zmq::tune_tcp_retransmit_timeout (fd_t sockfd_, int timeout_)
&& errno != EBADF
&& errno != EDESTADDRREQ
&& errno != EFAULT
&& errno != EINVAL
&& errno != EISCONN
&& errno != EMSGSIZE
&& errno != ENOMEM
Expand All @@ -240,21 +239,21 @@ int zmq::tcp_read (fd_t s_, void *data_, size_t size_)

// If not a single byte can be read from the socket in non-blocking mode
// we'll get an error (this may happen during the speculative read).
if (rc == SOCKET_ERROR) {
const int last_error = WSAGetLastError();
if (last_error == WSAEWOULDBLOCK) {
errno = EAGAIN;
}
else {
wsa_assert (last_error == WSAENETDOWN ||
last_error == WSAENETRESET ||
last_error == WSAECONNABORTED ||
last_error == WSAETIMEDOUT ||
last_error == WSAECONNRESET ||
last_error == WSAECONNREFUSED ||
last_error == WSAENOTCONN);
errno = wsa_error_to_errno (last_error);
}
if (rc == SOCKET_ERROR) {
const int last_error = WSAGetLastError();
if (last_error == WSAEWOULDBLOCK) {
errno = EAGAIN;
}
else {
wsa_assert (last_error == WSAENETDOWN ||
last_error == WSAENETRESET ||
last_error == WSAECONNABORTED ||
last_error == WSAETIMEDOUT ||
last_error == WSAECONNRESET ||
last_error == WSAECONNREFUSED ||
last_error == WSAENOTCONN);
errno = wsa_error_to_errno (last_error);
}
}

return rc == SOCKET_ERROR ? -1 : rc;
Expand All @@ -269,7 +268,6 @@ int zmq::tcp_read (fd_t s_, void *data_, size_t size_)
if (rc == -1) {
errno_assert (errno != EBADF
&& errno != EFAULT
&& errno != EINVAL
&& errno != ENOMEM
&& errno != ENOTSOCK);
if (errno == EWOULDBLOCK || errno == EINTR)
Expand Down

0 comments on commit ac46e6d

Please sign in to comment.