From 97333deb3f6713d7d12168c8980d69cc60961063 Mon Sep 17 00:00:00 2001 From: Yang Tse Date: Wed, 2 Jul 2008 03:04:56 +0000 Subject: fallback to gettimeofday when monotonic clock is unavailable at run-time --- ares/CHANGES | 3 +++ ares/RELEASE-NOTES | 1 + ares/acinclude.m4 | 30 ++++++------------------------ ares/ares__timeval.c | 21 ++++++++++++++++++--- 4 files changed, 28 insertions(+), 27 deletions(-) (limited to 'ares') diff --git a/ares/CHANGES b/ares/CHANGES index 1266fb854..ffe530d52 100644 --- a/ares/CHANGES +++ b/ares/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 diff --git a/ares/RELEASE-NOTES b/ares/RELEASE-NOTES index bad9445c8..6990b765f 100644 --- a/ares/RELEASE-NOTES +++ b/ares/RELEASE-NOTES @@ -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: diff --git a/ares/acinclude.m4 b/ares/acinclude.m4 index 7a162bab3..79da24b18 100644 --- a/ares/acinclude.m4 +++ b/ares/acinclude.m4 @@ -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 #endif -#ifdef HAVE_UNISTD_H -#include -#endif #ifdef HAVE_SYS_TIME_H #include #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 #endif -#ifdef HAVE_UNISTD_H -#include -#endif #ifdef HAVE_SYS_TIME_H #include #ifdef TIME_WITH_SYS_TIME @@ -1572,9 +1558,6 @@ AC_DEFUN([CURL_CHECK_LIBS_CLOCK_GETTIME_MONOTONIC], [ #ifdef HAVE_SYS_TYPES_H #include #endif -#ifdef HAVE_UNISTD_H -#include -#endif #ifdef HAVE_SYS_TIME_H #include #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]) diff --git a/ares/ares__timeval.c b/ares/ares__timeval.c index c3f39f523..7437b5a18 100644 --- a/ares/ares__timeval.c +++ b/ares/ares__timeval.c @@ -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; } -- cgit v1.2.3