You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by yl...@apache.org on 2023/03/21 15:44:06 UTC

svn commit: r1908616 - in /apr/apr/trunk: configure.in test/testpoll.c

Author: ylavic
Date: Tue Mar 21 15:44:06 2023
New Revision: 1908616

URL: http://svn.apache.org/viewvc?rev=1908616&view=rev
Log:
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.


Modified:
    apr/apr/trunk/configure.in
    apr/apr/trunk/test/testpoll.c

Modified: apr/apr/trunk/configure.in
URL: http://svn.apache.org/viewvc/apr/apr/trunk/configure.in?rev=1908616&r1=1908615&r2=1908616&view=diff
==============================================================================
--- apr/apr/trunk/configure.in (original)
+++ apr/apr/trunk/configure.in Tue Mar 21 15:44:06 2023
@@ -1099,7 +1099,7 @@ AC_CACHE_CHECK([for epoll support], [apr
 #include <sys/epoll.h>
 #include <unistd.h>
 
-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 suppor
 #include <sys/epoll.h>
 #include <unistd.h>
 
-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";
    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 <unistd.h>
+#include <sys/epoll.h>
+#include <sys/time.h>   /* 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([

Modified: apr/apr/trunk/test/testpoll.c
URL: http://svn.apache.org/viewvc/apr/apr/trunk/test/testpoll.c?rev=1908616&r1=1908615&r2=1908616&view=diff
==============================================================================
--- apr/apr/trunk/test/testpoll.c (original)
+++ apr/apr/trunk/test/testpoll.c Tue Mar 21 15:44:06 2023
@@ -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,
     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, voi
 
     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, voi
 
             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, voi
             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() */
         }