From a71f7b04055cb30ef523472f75c981cf02d016a5 Mon Sep 17 00:00:00 2001 From: sigiesec Date: Tue, 22 Aug 2017 20:00:29 +0200 Subject: [PATCH] Problem: zmq_poller_* uses ETIMEDOUT (instead of the usual EAGAIN) to indicate timeouts Solution: replace ETIMEDOUT within socket_poller_t and all client code by EAGAIN Fixes #2713 --- src/proxy.cpp | 4 ++-- src/socket_poller.cpp | 8 ++++---- src/zmq.cpp | 2 +- tests/test_poller.cpp | 10 ++++------ 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/proxy.cpp b/src/proxy.cpp index d6f4f6ad..aca80e12 100644 --- a/src/proxy.cpp +++ b/src/proxy.cpp @@ -271,13 +271,13 @@ int zmq::proxy ( // If one of receiving end's queue is full ('ZMQ_POLLOUT' not available), // 'poller_wait' is pointed to 'poller_receive_blocked', 'poller_send_blocked' or 'poller_both_blocked'. rc = poller_wait->wait (events, 3, -1); - if (rc < 0 && errno == ETIMEDOUT) + if (rc < 0 && errno == EAGAIN) rc = 0; CHECK_RC_EXIT_ON_FAILURE (); // Some of events waited for by 'poller_wait' have arrived, now poll for everything without blocking. rc = poller_all->wait (events, 3, 0); - if (rc < 0 && errno == ETIMEDOUT) + if (rc < 0 && errno == EAGAIN) rc = 0; CHECK_RC_EXIT_ON_FAILURE (); diff --git a/src/socket_poller.cpp b/src/socket_poller.cpp index 8ebc1801..25e2984b 100644 --- a/src/socket_poller.cpp +++ b/src/socket_poller.cpp @@ -415,7 +415,7 @@ int zmq::socket_poller_t::wait (zmq::socket_poller_t::event_t *events_, int n_ev // no event occured within the specified timeout. Otherwise the caller // needs to check the return value AND the event to avoid using the // nullified event data. - errno = ETIMEDOUT; + errno = EAGAIN; if (timeout_ == 0) return -1; #if defined ZMQ_HAVE_WINDOWS @@ -550,7 +550,7 @@ int zmq::socket_poller_t::wait (zmq::socket_poller_t::event_t *events_, int n_ev if (now >= end) break; } - errno = ETIMEDOUT; + errno = EAGAIN; return -1; #elif defined ZMQ_POLL_BASED_ON_SELECT @@ -560,7 +560,7 @@ int zmq::socket_poller_t::wait (zmq::socket_poller_t::event_t *events_, int n_ev // no event occured within the specified timeout. Otherwise the caller // needs to check the return value AND the event to avoid using the // nullified event data. - errno = ETIMEDOUT; + errno = EAGAIN; if (timeout_ == 0) return -1; #if defined ZMQ_HAVE_WINDOWS @@ -711,7 +711,7 @@ int zmq::socket_poller_t::wait (zmq::socket_poller_t::event_t *events_, int n_ev break; } - errno = ETIMEDOUT; + errno = EAGAIN; return -1; #else diff --git a/src/zmq.cpp b/src/zmq.cpp index 5708120d..dca9088c 100644 --- a/src/zmq.cpp +++ b/src/zmq.cpp @@ -813,7 +813,7 @@ inline int zmq_poller_poll (zmq_pollitem_t *items_, int nitems_, long timeout_) rc = zmq_poller_wait_all (&poller, events, nitems_, timeout_); if (rc < 0) { delete [] events; - if (zmq_errno() == ETIMEDOUT) { + if (zmq_errno() == EAGAIN) { return 0; } return rc; diff --git a/tests/test_poller.cpp b/tests/test_poller.cpp index b1af48b0..1573dcd5 100644 --- a/tests/test_poller.cpp +++ b/tests/test_poller.cpp @@ -170,18 +170,16 @@ void test_wait_corner_cases (void *ctx) void *poller = zmq_poller_new (); assert (poller != NULL); - // TODO zmq_poller_wait should return EAGAIN instead of ETIMEDOUT (like all other zmq functions) - zmq_poller_event_t event; int rc = zmq_poller_wait(poller, &event, 0); - assert (rc == -1 && errno == ETIMEDOUT); + assert (rc == -1 && errno == EAGAIN); // this can never return since no socket was registered, and should yield an error rc = zmq_poller_wait(poller, &event, -1); assert (rc == -1 && errno == EFAULT); rc = zmq_poller_wait_all (poller, &event, 0, 0); - assert (rc == -1 && errno == ETIMEDOUT); + assert (rc == -1 && errno == EAGAIN); // this can never return since no socket was registered, and should yield an error rc = zmq_poller_wait_all (poller, &event, 0, -1); @@ -238,7 +236,7 @@ int main (void) // waiting on poller with no registered sockets should report error rc = zmq_poller_wait (poller, &event, 0); assert (rc == -1); - assert (errno == ETIMEDOUT); + assert (errno == EAGAIN); // register sink rc = zmq_poller_add (poller, sink, sink, ZMQ_POLLIN); @@ -260,7 +258,7 @@ int main (void) // We expect timed out rc = zmq_poller_wait (poller, &event, 0); assert (rc == -1); - assert (errno == ETIMEDOUT); + assert (errno == EAGAIN); // Stop polling sink rc = zmq_poller_remove (poller, sink);