From 08d3bc37aa51f1d898548f5677a89e872f02c169 Mon Sep 17 00:00:00 2001 From: Yang Tse Date: Sun, 29 Jun 2008 03:19:21 +0000 Subject: [PATCH] John Lightsey filed bug report #1999181: "CLOCK_MONOTONIC always fails on some systems" (http://curl.haxx.se/bug/view.cgi?id=1999181). The problem was that the configure script did not use the _POSIX_MONOTONIC_CLOCK feature test macro when checking monotonic clock availability. This is now fixed and the monotonic clock will not be used unless the feature test macro is defined with a value greater than zero indicating always supported. --- acinclude.m4 | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/acinclude.m4 b/acinclude.m4 index 7f51d150..1875c0d5 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -1446,13 +1446,16 @@ 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 sys/time.h time.h) + AC_CHECK_HEADERS(sys/types.h unistd.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 @@ -1464,8 +1467,14 @@ AC_DEFUN([CURL_CHECK_FUNC_CLOCK_GETTIME_MONOTONIC], [ #endif #endif ]],[[ +#if defined(_POSIX_MONOTONIC_CLOCK) && (_POSIX_MONOTONIC_CLOCK > 0) + dnl The monotonic clock will not be used unless the feature test macro is + dnl 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]) @@ -1506,6 +1515,9 @@ 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 @@ -1549,6 +1561,46 @@ AC_DEFUN([CURL_CHECK_LIBS_CLOCK_GETTIME_MONOTONIC], [ ;; esac # + dnl only do runtime verification when not cross-compiling + if test "x$cross_compiling" != "xyes" && + test "$ac_cv_func_clock_gettime" = "yes"; then + AC_MSG_CHECKING([if monotonic clock_gettime works]) + AC_RUN_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 +#include +#endif +#else +#ifdef HAVE_TIME_H +#include +#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); + ]]) + ],[ + AC_MSG_RESULT([yes]) + ],[ + AC_MSG_RESULT([no]) + AC_MSG_WARN([HAVE_CLOCK_GETTIME_MONOTONIC will not be defined]) + ac_cv_func_clock_gettime="no" + LIBS="$curl_cv_save_LIBS" + ]) + fi + # case "$ac_cv_func_clock_gettime" in yes) AC_DEFINE_UNQUOTED(HAVE_CLOCK_GETTIME_MONOTONIC, 1,