diff options
author | Martin Sustrik <sustrik@250bpm.com> | 2011-06-19 19:08:48 +0200 |
---|---|---|
committer | Martin Sustrik <sustrik@250bpm.com> | 2011-06-19 19:08:48 +0200 |
commit | 082f8e19b7591f6f8f34edcc27f195510051c2ba (patch) | |
tree | 3788ddd389d9924c84af7abe0bf3a541646f6a06 | |
parent | ed680a395edb9260eced8289b33041248782f979 (diff) |
Mailbox timeouts fixed on Windows
Signed-off-by: Martin Sustrik <sustrik@250bpm.com>
-rw-r--r-- | src/mailbox.cpp | 27 |
1 files changed, 25 insertions, 2 deletions
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 <poll.h> #elif defined ZMQ_RCVTIMEO_BASED_ON_SELECT +#if defined ZMQ_HAVE_WINDOWS +#include "windows.hpp" +#elif defined ZMQ_HAVE_HPUX +#include <sys/param.h> +#include <sys/types.h> +#include <sys/time.h> +#elif defined ZMQ_HAVE_OPENVMS +#include <sys/types.h> +#include <sys/time.h> +#else #include <sys/select.h> #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; } |