fallback to gettimeofday when monotonic clock is unavailable at run-time
authorYang Tse <yangsita@gmail.com>
Wed, 2 Jul 2008 03:04:56 +0000 (03:04 +0000)
committerYang Tse <yangsita@gmail.com>
Wed, 2 Jul 2008 03:04:56 +0000 (03:04 +0000)
CHANGES
RELEASE-NOTES
acinclude.m4
ares__timeval.c

diff --git a/CHANGES b/CHANGES
index 1266fb8..ffe530d 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,8 @@
   Changelog for the c-ares project
 
+* Jul 2 2008 (Yang Tse)
+- Fallback to gettimeofday when monotonic clock is unavailable at run-time.
+
 * Jun 30 2008 (Daniel Stenberg)
 
 - As was pointed out to me by Andreas Schuldei, the MAXHOSTNAMELEN define is
index bad9445..6990b76 100644 (file)
@@ -2,6 +2,7 @@ This is what's new and changed in the c-ares 1.5.3 release:
 
  o fix adig sample application compilation failure on some systems
  o fix pkg-config reporting of private libraries needed for static linking
+ o fallback to gettimeofday when monotonic clock is unavailable at run-time
 
 Thanks go to these friendly people for their efforts and contributions:
 
index 7a162ba..79da24b 100644 (file)
@@ -1446,16 +1446,13 @@ dnl Check if monotonic clock_gettime is available.
 
 AC_DEFUN([CURL_CHECK_FUNC_CLOCK_GETTIME_MONOTONIC], [
   AC_REQUIRE([AC_HEADER_TIME])dnl
-  AC_CHECK_HEADERS(sys/types.h unistd.h sys/time.h time.h)
-  AC_MSG_CHECKING([for POSIX always supported monotonic clock_gettime])
+  AC_CHECK_HEADERS(sys/types.h sys/time.h time.h)
+  AC_MSG_CHECKING([for monotonic clock_gettime])
   AC_COMPILE_IFELSE([
     AC_LANG_PROGRAM([[
 #ifdef HAVE_SYS_TYPES_H
 #include <sys/types.h>
 #endif
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
 #ifdef TIME_WITH_SYS_TIME
@@ -1467,16 +1464,8 @@ AC_DEFUN([CURL_CHECK_FUNC_CLOCK_GETTIME_MONOTONIC], [
 #endif
 #endif
     ]],[[
-#if defined(_POSIX_MONOTONIC_CLOCK) && (_POSIX_MONOTONIC_CLOCK > 0)
-      /*
-      The monotonic clock will not be used unless the feature test macro is
-      defined with a value greater than zero indicating _always_ supported.
-      */
       struct timespec ts;
       (void)clock_gettime(CLOCK_MONOTONIC, &ts);
-#else
-      HAVE_CLOCK_GETTIME_MONOTONIC shall not be defined.
-#endif
     ]])
   ],[
     AC_MSG_RESULT([yes])
@@ -1485,8 +1474,8 @@ AC_DEFUN([CURL_CHECK_FUNC_CLOCK_GETTIME_MONOTONIC], [
     AC_MSG_RESULT([no])
     ac_cv_func_clock_gettime="no"
   ])
-  dnl Definition of HAVE_CLOCK_GETTIME_MONOTONIC is intentionally
-  dnl postponed until library linking checks for clock_gettime pass.
+  dnl Definition of HAVE_CLOCK_GETTIME_MONOTONIC is intentionally postponed
+  dnl until library linking and run-time checks for clock_gettime succeed.
 ]) dnl AC_DEFUN
 
 
@@ -1517,9 +1506,6 @@ AC_DEFUN([CURL_CHECK_LIBS_CLOCK_GETTIME_MONOTONIC], [
 #ifdef HAVE_SYS_TYPES_H
 #include <sys/types.h>
 #endif
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
 #ifdef TIME_WITH_SYS_TIME
@@ -1572,9 +1558,6 @@ AC_DEFUN([CURL_CHECK_LIBS_CLOCK_GETTIME_MONOTONIC], [
 #ifdef HAVE_SYS_TYPES_H
 #include <sys/types.h>
 #endif
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
 #ifdef TIME_WITH_SYS_TIME
@@ -1586,12 +1569,11 @@ AC_DEFUN([CURL_CHECK_LIBS_CLOCK_GETTIME_MONOTONIC], [
 #endif
 #endif
         ]],[[
-#if defined(_POSIX_MONOTONIC_CLOCK) && (_POSIX_MONOTONIC_CLOCK > 0)
           struct timespec ts;
           if (0 == clock_gettime(CLOCK_MONOTONIC, &ts))
             exit(0);
-#endif
-          exit(1);
+          else
+            exit(1);
         ]])
       ],[
         AC_MSG_RESULT([yes])
index c3f39f5..7437b5a 100644 (file)
@@ -46,9 +46,24 @@ struct timeval ares__tvnow(void)
   */
   struct timeval now;
   struct timespec tsnow;
-  (void)clock_gettime(CLOCK_MONOTONIC, &tsnow);
-  now.tv_sec = tsnow.tv_sec;
-  now.tv_usec = tsnow.tv_nsec / 1000;
+  if(0 == clock_gettime(CLOCK_MONOTONIC, &tsnow)) {
+    now.tv_sec = tsnow.tv_sec;
+    now.tv_usec = tsnow.tv_nsec / 1000;
+  }
+  /*
+  ** Even when the configure process has truly detected monotonic clock
+  ** availability, it might happen that it is not actually available at
+  ** run-time. When this occurs simply fallback to other time source.
+  */
+#ifdef HAVE_GETTIMEOFDAY
+  else
+    (void)gettimeofday(&now, NULL);
+#else
+  else {
+    now.tv_sec = (long)time(NULL);
+    now.tv_usec = 0;
+  }
+#endif
   return now;
 }