Problem: poller sleeps forever if no events

Solution: Fail with error if no events are active and timeout is infinite
parent 7b1fef28
...@@ -256,7 +256,8 @@ At least one of the registered objects is a 'socket' whose associated 0MQ ...@@ -256,7 +256,8 @@ At least one of the registered objects is a 'socket' whose associated 0MQ
'context' was terminated. 'context' was terminated.
*EFAULT*:: *EFAULT*::
The provided 'events' was NULL, or 'poller' did not point to a valid poller, The provided 'events' was NULL, or 'poller' did not point to a valid poller,
or there are no registered objects and 'timeout' was negative. or there are no registered objects or all event subscriptions are disabled
and 'timeout' was negative.
*EINTR*:: *EINTR*::
The operation was interrupted by delivery of a signal before any events were The operation was interrupted by delivery of a signal before any events were
available. available.
......
...@@ -548,6 +548,11 @@ int zmq::socket_poller_t::wait (zmq::socket_poller_t::event_t *events_, ...@@ -548,6 +548,11 @@ int zmq::socket_poller_t::wait (zmq::socket_poller_t::event_t *events_,
} }
if (unlikely (_pollset_size == 0)) { if (unlikely (_pollset_size == 0)) {
if (timeout_ < 0) {
// Fail instead of trying to sleep forever
errno = EFAULT;
return -1;
}
// We'll report an error (timed out) as if the list was non-empty and // We'll report an error (timed out) as if the list was non-empty and
// no event occurred within the specified timeout. Otherwise the caller // no event occurred within the specified timeout. Otherwise the caller
// needs to check the return value AND the event to avoid using the // needs to check the return value AND the event to avoid using the
......
...@@ -512,6 +512,17 @@ void call_poller_wait_all_empty_with_timeout_fails (void *poller_, ...@@ -512,6 +512,17 @@ void call_poller_wait_all_empty_with_timeout_fails (void *poller_,
zmq_poller_wait_all (poller_, &event, 0, -1)); zmq_poller_wait_all (poller_, &event, 0, -1));
} }
void call_poller_wait_all_inf_disabled_fails (void *poller_, void *socket_)
{
TEST_ASSERT_SUCCESS_ERRNO (zmq_poller_add (poller_, socket_, NULL, 0));
zmq_poller_event_t events[1];
TEST_ASSERT_FAILURE_ERRNO (EAGAIN,
zmq_poller_wait_all (poller_, events, 1, 0));
TEST_ASSERT_FAILURE_ERRNO (EFAULT,
zmq_poller_wait_all (poller_, events, 1, -1));
}
TEST_CASE_FUNC_PARAM (call_poller_wait_empty_with_timeout_fails, TEST_CASE_FUNC_PARAM (call_poller_wait_empty_with_timeout_fails,
test_with_empty_poller) test_with_empty_poller)
TEST_CASE_FUNC_PARAM (call_poller_wait_empty_without_timeout_fails, TEST_CASE_FUNC_PARAM (call_poller_wait_empty_without_timeout_fails,
...@@ -522,6 +533,8 @@ TEST_CASE_FUNC_PARAM (call_poller_wait_all_empty_without_timeout_fails, ...@@ -522,6 +533,8 @@ TEST_CASE_FUNC_PARAM (call_poller_wait_all_empty_without_timeout_fails,
test_with_empty_poller) test_with_empty_poller)
TEST_CASE_FUNC_PARAM (call_poller_wait_all_empty_with_timeout_fails, TEST_CASE_FUNC_PARAM (call_poller_wait_all_empty_with_timeout_fails,
test_with_empty_poller) test_with_empty_poller)
TEST_CASE_FUNC_PARAM (call_poller_wait_all_inf_disabled_fails,
test_with_empty_poller)
void test_poll_basic () void test_poll_basic ()
{ {
...@@ -695,6 +708,7 @@ int main (void) ...@@ -695,6 +708,7 @@ int main (void)
RUN_TEST (test_call_poller_wait_all_empty_negative_count_fails); RUN_TEST (test_call_poller_wait_all_empty_negative_count_fails);
RUN_TEST (test_call_poller_wait_all_empty_without_timeout_fails); RUN_TEST (test_call_poller_wait_all_empty_without_timeout_fails);
RUN_TEST (test_call_poller_wait_all_empty_with_timeout_fails); RUN_TEST (test_call_poller_wait_all_empty_with_timeout_fails);
RUN_TEST (test_call_poller_wait_all_inf_disabled_fails);
RUN_TEST (test_call_poller_fd_no_signaler); RUN_TEST (test_call_poller_fd_no_signaler);
RUN_TEST (test_call_poller_fd); RUN_TEST (test_call_poller_fd);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment