From 082f8e19b7591f6f8f34edcc27f195510051c2ba Mon Sep 17 00:00:00 2001 From: Martin Sustrik Date: Sun, 19 Jun 2011 19:08:48 +0200 Subject: Mailbox timeouts fixed on Windows Signed-off-by: Martin Sustrik --- src/mailbox.cpp | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/mailbox.cpp b/src/mailbox.cpp index 402d025..78455a4 100644 --- a/src/mailbox.cpp +++ b/src/mailbox.cpp @@ -41,8 +41,19 @@ #if defined ZMQ_RCVTIMEO_BASED_ON_POLL #include #elif defined ZMQ_RCVTIMEO_BASED_ON_SELECT +#if defined ZMQ_HAVE_WINDOWS +#include "windows.hpp" +#elif defined ZMQ_HAVE_HPUX +#include +#include +#include +#elif defined ZMQ_HAVE_OPENVMS +#include +#include +#else #include #endif +#endif #include "mailbox.hpp" #include "err.hpp" @@ -121,7 +132,7 @@ int zmq::mailbox_t::recv (command_t *cmd_, int timeout_) // and a command is not available. Save value of errno if we wish to pass // it to caller. int err = 0; - int nbytes = ::recv (r, (char *)cmd_, sizeof (command_t), 0); + int nbytes = ::recv (r, (char*) cmd_, sizeof (command_t), 0); if (nbytes == -1 && WSAGetLastError () == WSAEWOULDBLOCK) err = EAGAIN; @@ -440,25 +451,37 @@ int zmq::mailbox_t::recv_timeout (command_t *cmd_, int timeout_) struct timeval timeout; timeout.tv_sec = timeout_ / 1000; timeout.tv_usec = timeout_ % 1000 * 1000; +#ifdef ZMQ_HAVE_WINDOWS + int rc = select (0, &fds, NULL, NULL, &timeout); + wsa_assert (rc != SOCKET_ERROR); +#else int rc = select (r + 1, &fds, NULL, NULL, &timeout); if (unlikely (rc < 0)) { zmq_assert (errno == EINTR); return -1; } - else if (unlikely (rc == 0)) { +#endif + if (unlikely (rc == 0)) { errno = EAGAIN; return -1; } zmq_assert (rc == 1); + #else #error #endif // The file descriptor is ready for reading. Extract one command out of it. +#ifdef ZMQ_HAVE_WINDOWS + int nbytes = ::recv (r, (char*) cmd_, sizeof (command_t), 0); + wsa_assert (nbytes != SOCKET_ERROR); +#else ssize_t nbytes = ::recv (r, cmd_, sizeof (command_t), 0); if (unlikely (rc < 0 && errno == EINTR)) return -1; + errno_assert (nbytes > 0); +#endif zmq_assert (nbytes == sizeof (command_t)); return 0; } -- cgit v1.2.3