diff options
Diffstat (limited to 'src')
-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; } |