gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[libmicrohttpd] branch master updated: Added fallback functions for MHD_


From: gnunet
Subject: [libmicrohttpd] branch master updated: Added fallback functions for MHD_monotonic_msec_counter() values
Date: Sun, 29 Aug 2021 21:11:21 +0200

This is an automated email from the git hooks/post-receive script.

karlson2k pushed a commit to branch master
in repository libmicrohttpd.

The following commit(s) were added to refs/heads/master by this push:
     new e544cf36 Added fallback functions for MHD_monotonic_msec_counter() 
values
e544cf36 is described below

commit e544cf36300563fc4ed790b80a80b52669529bbb
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
AuthorDate: Sun Aug 29 22:07:13 2021 +0300

    Added fallback functions for MHD_monotonic_msec_counter() values
---
 configure.ac                    | 57 +++++++++++++++++++++++++++++++++++++++
 src/microhttpd/mhd_mono_clock.c | 59 +++++++++++++++++++++++++++++++++--------
 2 files changed, 105 insertions(+), 11 deletions(-)

diff --git a/configure.ac b/configure.ac
index 0cf4e43f..6478b67c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1479,6 +1479,63 @@ AC_LINK_IFELSE(
   [AC_MSG_RESULT([[no]])
   ])
 
+AS_VAR_IF([ac_cv_header_time_h], ["yes"],
+  [
+    AC_CACHE_CHECK([[for C11 timespec_get()]], [mhd_cv_func_timespec_get],
+      [
+        AC_LINK_IFELSE(
+          [
+            AC_LANG_PROGRAM(
+              [[
+#include <time.h>
+
+#ifndef TIME_UTC
+#error TIME_UTC must be defined to use timespec_get()
+choke me now
+#endif
+              ]],
+              [[
+  struct timespec ts;
+  if (TIME_UTC != timespec_get (&ts, TIME_UTC))
+    return 1;
+              ]]
+            )
+          ], [[mhd_cv_func_timespec_get="yes"]], 
[[mhd_cv_func_timespec_get="no"]]
+        )
+      ]
+    )
+    AS_VAR_IF([mhd_cv_func_timespec_get], ["yes"],
+      [AC_DEFINE([HAVE_TIMESPEC_GET], [1], [Define to 1 if you have C11 
`mhd_cv_func_timespec_get' function and TIME_UTC macro.])]
+    )
+  ]
+)
+
+AS_VAR_SET_IF([ac_cv_func_gettimeofday], 
[mhd_cv_func_gettimeofday="${ac_cv_func_gettimeofday}"])
+AC_CACHE_CHECK([[for gettimeofday(2)]], [mhd_cv_func_gettimeofday], [
+  AC_LINK_IFELSE(
+    [
+      AC_LANG_PROGRAM(
+        [[
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif /* HAVE_SYS_TIME_H */
+#ifdef HAVE_TIME_H
+#include <time.h>
+#endif /* HAVE_TIME_H */
+        ]],
+        [[
+  struct timeval tv;
+  if (0 != gettimeofday (&tv, (void*) 0))
+    return 1;
+        ]]
+      )
+    ], [[mhd_cv_func_gettimeofday="yes"]], [[mhd_cv_func_gettimeofday="no"]]
+  )
+])
+AS_VAR_IF([mhd_cv_func_gettimeofday], ["yes"],
+  [AC_DEFINE([HAVE_GETTIMEOFDAY], [1], [Define to 1 if you have `gettimeofday' 
function.])]
+)
+
 # IPv6
 AC_MSG_CHECKING(for IPv6)
 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
diff --git a/src/microhttpd/mhd_mono_clock.c b/src/microhttpd/mhd_mono_clock.c
index 122aab77..cc93ddfb 100644
--- a/src/microhttpd/mhd_mono_clock.c
+++ b/src/microhttpd/mhd_mono_clock.c
@@ -30,20 +30,12 @@
 #undef HAVE_CLOCK_GETTIME
 #endif /* _WIN32 && ! __CYGWIN__ && HAVE_CLOCK_GETTIME */
 
-#ifdef HAVE_CLOCK_GETTIME
+#ifdef HAVE_TIME_H
 #include <time.h>
-#endif /* HAVE_CLOCK_GETTIME */
-
-#ifdef HAVE_GETHRTIME
+#endif /* HAVE_TIME_H */
 #ifdef HAVE_SYS_TIME_H
-/* Solaris defines gethrtime() in sys/time.h */
 #include <sys/time.h>
 #endif /* HAVE_SYS_TIME_H */
-#ifdef HAVE_TIME_H
-/* HP-UX defines gethrtime() in time.h */
-#include <time.h>
-#endif /* HAVE_TIME_H */
-#endif /* HAVE_GETHRTIME */
 
 #ifdef HAVE_CLOCK_GET_TIME
 #include <mach/mach.h>
@@ -65,6 +57,10 @@ static clock_serv_t mono_clock_service = 
_MHD_INVALID_CLOCK_SERV;
 #include <stdint.h>
 #endif /* _WIN32 */
 
+#ifndef NULL
+#define NULL ((void*)0)
+#endif /* ! NULL */
+
 #ifdef HAVE_CLOCK_GETTIME
 #ifdef CLOCK_REALTIME
 #define _MHD_UNWANTED_CLOCK CLOCK_REALTIME
@@ -80,6 +76,10 @@ static clockid_t mono_clock_id = _MHD_UNWANTED_CLOCK;
   defined(HAVE_GETHRTIME)
 static time_t mono_clock_start;
 #endif /* HAVE_CLOCK_GETTIME || HAVE_CLOCK_GET_TIME || HAVE_GETHRTIME */
+#if defined(HAVE_TIMESPEC_GET) || defined(HAVE_GETTIMEOFDAY)
+/* The start value shared for timespec_get() and gettimeofday () */
+static time_t gettime_start;
+#endif /* HAVE_TIMESPEC_GET || HAVE_GETTIMEOFDAY */
 static time_t sys_clock_start;
 #ifdef HAVE_GETHRTIME
 static hrtime_t hrtime_start;
@@ -332,6 +332,25 @@ MHD_monotonic_sec_counter_init (void)
   (void) mono_clock_source; /* avoid compiler warning */
 #endif /* HAVE_CLOCK_GET_TIME */
 
+#ifdef HAVE_TIMESPEC_GET
+  if (1)
+  {
+    struct timespec tsg;
+    if (TIME_UTC == timespec_get (&tsg, TIME_UTC))
+      gettime_start = tsg.tv_sec;
+    else
+      gettime_start = 0;
+  }
+#elif defined (HAVE_GETTIMEOFDAY)
+  if (1)
+  {
+    struct timeval tv;
+    if (0 == gettimeofday (&tv, NULL))
+      gettime_start = tv.tv_sec;
+    else
+      gettime_start = 0;
+  }
+#endif /* HAVE_GETTIMEOFDAY */
   sys_clock_start = time (NULL);
 }
 
@@ -415,9 +434,11 @@ MHD_monotonic_sec_counter (void)
 uint64_t
 MHD_monotonic_msec_counter (void)
 {
-#ifdef HAVE_CLOCK_GETTIME
+#if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_TIMESPEC_GET)
   struct timespec ts;
+#endif /* HAVE_CLOCK_GETTIME || HAVE_TIMESPEC_GET */
 
+#ifdef HAVE_CLOCK_GETTIME
   if ( (_MHD_UNWANTED_CLOCK != mono_clock_id) &&
        (0 == clock_gettime (mono_clock_id,
                             &ts)) )
@@ -457,5 +478,21 @@ MHD_monotonic_msec_counter (void)
     return ((uint64_t) (gethrtime () - hrtime_start)) / 1000000;
 #endif /* HAVE_GETHRTIME */
 
+  /* Fallbacks, affected by system time change */
+#ifdef HAVE_TIMESPEC_GET
+  if (TIME_UTC == timespec_get (&ts, TIME_UTC))
+    return (uint64_t) (((uint64_t) (ts.tv_sec - gettime_start)) * 1000
+                       + (ts.tv_nsec / 1000000));
+#elif defined (HAVE_GETTIMEOFDAY)
+  if (1)
+  {
+    struct timeval tv;
+    if (0 == gettimeofday (&tv, NULL))
+      return (uint64_t) (((uint64_t) (tv.tv_sec - gettime_start)) * 1000
+                         + (tv.tv_usec / 1000));
+  }
+#endif /* HAVE_GETTIMEOFDAY */
+
+  /* The last resort fallback with very low resolution */
   return (uint64_t) (time (NULL) - sys_clock_start) * 1000;
 }

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]