From 99fffba15352cac7b21bf9efd3fb1b5484af1415 Mon Sep 17 00:00:00 2001 From: Yann Ylavic Date: Tue, 21 Mar 2023 15:44:06 +0000 Subject: tests: check whether epoll_wait() timeout is reliable and adjust justsleep(). * configure.in: Small epoll_wait() loop to check timeout reliability and set HAVE_EPOLL_WAIT_RELIABLE_TIMEOUT. * test/testpoll.c(justsleep): Allow some jiffy is !HAVE_EPOLL_WAIT_RELIABLE_TIMEOUT. git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1908616 13f79535-47bb-0310-9956-ffa450edef68 --- configure.in | 45 +++++++++++++++++++++++++++++++++++++++++++-- test/testpoll.c | 30 +++++++++++++++++++++++------- 2 files changed, 66 insertions(+), 9 deletions(-) diff --git a/configure.in b/configure.in index 9e828ec6a..2225cb0a4 100644 --- a/configure.in +++ b/configure.in @@ -1099,7 +1099,7 @@ AC_CACHE_CHECK([for epoll support], [apr_cv_epoll], #include #include -int main() +int main(int argc, const char *argv[]) { return epoll_create(5) == -1; }], [apr_cv_epoll=yes], [apr_cv_epoll=no], [apr_cv_epoll=no])]) @@ -1115,7 +1115,7 @@ AC_CACHE_CHECK([for epoll_create1 support], [apr_cv_epoll_create1], #include #include -int main() +int main(int argc, const char *argv[]) { return epoll_create1(0) == -1; }], [apr_cv_epoll_create1=yes], [apr_cv_epoll_create1=no], [apr_cv_epoll_create1=no])]) @@ -1124,6 +1124,47 @@ if test "$apr_cv_epoll_create1" = "yes"; then AC_DEFINE([HAVE_EPOLL_CREATE1], 1, [Define if epoll_create1 function is supported]) fi +# check if epoll_wait() timeout is a reliable as min min +AC_CACHE_CHECK([whether epoll_wait has a reliable timeout (min)], + [apr_cv_epoll_wait_has_reliable_timeout], +[AC_TRY_RUN([ +#include +#include +#include /* for gettimeofday */ + +#define TV2US(tv) ((long long)(tv).tv_sec * 1000000 + (tv).tv_usec) + +int main(int argc, const char *argv[]) +{ + int ret = 0, fd, i; + struct epoll_event events; + struct timeval t1, t2; + +#ifdef HAVE_EPOLL_CREATE1 + fd = epoll_create1(0); +#else + fd = epoll_create(1); +#endif + if (fd < 0) { + return 1; + } + for (i = 0; i < 10; ++i) { + (void)gettimeofday(&t1, NULL); + (void)epoll_wait(fd, &events, 1, 100); /* ms */ + (void)gettimeofday(&t2, NULL); + ret |= (TV2US(t2) - TV2US(t1)) < 100000; /* us */ + } + close(fd); + return ret; +}], [apr_cv_epoll_wait_has_reliable_timeout=yes], + [apr_cv_epoll_wait_has_reliable_timeout=no], + [apr_cv_epoll_wait_has_reliable_timeout=no])]) + +if test "$apr_cv_epoll_wait_has_reliable_timeout" = "yes"; then + AC_DEFINE([HAVE_EPOLL_WAIT_RELIABLE_TIMEOUT], 1, + [Define if epoll_wait has a reliable timeout (min)]) +fi + # Check for z/OS async i/o support. AC_CACHE_CHECK([for asio -> message queue support], [apr_cv_aio_msgq], [AC_TRY_RUN([ diff --git a/test/testpoll.c b/test/testpoll.c index f22ec9253..822e59184 100644 --- a/test/testpoll.c +++ b/test/testpoll.c @@ -22,6 +22,13 @@ #include "apr_network_io.h" #include "apr_poll.h" +#if defined(__linux__) +#include "arch/unix/apr_private.h" +#endif +#ifndef HAVE_EPOLL_WAIT_RELIABLE_TIMEOUT +#define HAVE_EPOLL_WAIT_RELIABLE_TIMEOUT 0 +#endif + #define SMALL_NUM_SOCKETS 3 /* We can't use 64 here, because some platforms *ahem* Solaris *ahem* have * a default limit of 64 open file descriptors per process. If we use @@ -854,6 +861,16 @@ static void pollcb_wakeup(abts_case *tc, void *data) ABTS_INT_EQUAL(tc, APR_EINTR, rv); } +#define JUSTSLEEP_DELAY apr_time_from_msec(200) +#if HAVE_EPOLL_WAIT_RELIABLE_TIMEOUT +#define JUSTSLEEP_ENOUGH(ts, te) \ + ((te) - (ts) >= JUSTSLEEP_DELAY) +#else +#define JUSTSLEEP_JIFFY apr_time_from_msec(10) +#define JUSTSLEEP_ENOUGH(ts, te) \ + ((te) - (ts) >= JUSTSLEEP_DELAY - JUSTSLEEP_JIFFY) +#endif + static void justsleep(abts_case *tc, void *data) { apr_int32_t nsds; @@ -872,13 +889,13 @@ static void justsleep(abts_case *tc, void *data) nsds = 1; t1 = apr_time_now(); - rv = apr_poll(NULL, 0, &nsds, apr_time_from_msec(200)); + rv = apr_poll(NULL, 0, &nsds, JUSTSLEEP_DELAY); t2 = apr_time_now(); ABTS_INT_EQUAL(tc, 1, APR_STATUS_IS_TIMEUP(rv)); ABTS_INT_EQUAL(tc, 0, nsds); ABTS_ASSERT(tc, "apr_poll() didn't sleep", - (t2 - t1) >= apr_time_from_msec(200)); + JUSTSLEEP_ENOUGH(t1, t2)); for (i = 0; i < sizeof methods / sizeof methods[0]; i++) { rv = apr_pollset_create_ex(&pollset, 5, p, 0, methods[i]); @@ -887,14 +904,13 @@ static void justsleep(abts_case *tc, void *data) nsds = 1; t1 = apr_time_now(); - rv = apr_pollset_poll(pollset, apr_time_from_msec(200), &nsds, - &hot_files); + rv = apr_pollset_poll(pollset, JUSTSLEEP_DELAY, &nsds, &hot_files); t2 = apr_time_now(); ABTS_INT_EQUAL(tc, 1, APR_STATUS_IS_TIMEUP(rv)); ABTS_INT_EQUAL(tc, 0, nsds); ABTS_ASSERT(tc, "apr_pollset_poll() didn't sleep", - (t2 - t1) >= apr_time_from_msec(200)); + JUSTSLEEP_ENOUGH(t1, t2)); rv = apr_pollset_destroy(pollset); ABTS_INT_EQUAL(tc, APR_SUCCESS, rv); @@ -905,12 +921,12 @@ static void justsleep(abts_case *tc, void *data) ABTS_INT_EQUAL(tc, APR_SUCCESS, rv); t1 = apr_time_now(); - rv = apr_pollcb_poll(pollcb, apr_time_from_msec(200), NULL, NULL); + rv = apr_pollcb_poll(pollcb, JUSTSLEEP_DELAY, NULL, NULL); t2 = apr_time_now(); ABTS_INT_EQUAL(tc, 1, APR_STATUS_IS_TIMEUP(rv)); ABTS_ASSERT(tc, "apr_pollcb_poll() didn't sleep", - (t2 - t1) >= apr_time_from_msec(200)); + JUSTSLEEP_ENOUGH(t1, t2)); /* no apr_pollcb_destroy() */ } -- cgit v1.2.1