diff --git a/CHANGES b/CHANGES index bb5b5a1d2..555c56253 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,13 @@ Changelog +Yang Tse (2 Jul 2008) +- The previously committed fix for bug report #1999181 prevented using the + monotonic clock on any system without an always supported POSIX compliant + implementation. Now the POSIX compliant configuration check is removed and + will fallback to gettimeofday when the monotonic clock is unavailable at + run-time. + Daniel Stenberg (1 Jul 2008) - Rolland Dudemaine provided fixes to get libcurl to build for the INTEGRITY operating system. diff --git a/RELEASE-NOTES b/RELEASE-NOTES index dc71abf06..7c9490542 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -26,7 +26,7 @@ This release includes the following bugfixes: o SCP or SFTP over socks proxy crashed o RC4-MD5 cipher now works with NSS-built libcurl o range requests with --head are now done correctly - o configure script misdetected monotonic clock availability + o fallback to gettimeofday when monotonic clock is unavailable at run-time o range numbers could be made to wrongly get output as signed This release includes the following known bugs: diff --git a/acinclude.m4 b/acinclude.m4 index ce01ab45b..f120559d5 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -1979,16 +1979,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 @@ -2000,16 +1997,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]) @@ -2018,8 +2007,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 @@ -2050,9 +2039,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 @@ -2105,9 +2091,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 @@ -2119,12 +2102,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/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; } diff --git a/lib/timeval.c b/lib/timeval.c index 74f0b3a2f..25ae76329 100644 --- a/lib/timeval.c +++ b/lib/timeval.c @@ -52,9 +52,24 @@ struct timeval curlx_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; }