Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
fallback to gettimeofday when monotonic clock is unavailable at run-time
  • Loading branch information
yangtse committed Jul 2, 2008
1 parent 400d9d4 commit 97333de
Show file tree
Hide file tree
Showing 8 changed files with 60 additions and 55 deletions.
7 changes: 7 additions & 0 deletions CHANGES
Expand Up @@ -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.
Expand Down
2 changes: 1 addition & 1 deletion RELEASE-NOTES
Expand Up @@ -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:
Expand Down
30 changes: 6 additions & 24 deletions acinclude.m4
Expand Up @@ -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 <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
Expand All @@ -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])
Expand All @@ -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


Expand Down Expand Up @@ -2050,9 +2039,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
Expand Down Expand Up @@ -2105,9 +2091,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
Expand All @@ -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])
Expand Down
3 changes: 3 additions & 0 deletions 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
Expand Down
1 change: 1 addition & 0 deletions ares/RELEASE-NOTES
Expand Up @@ -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:

Expand Down
30 changes: 6 additions & 24 deletions ares/acinclude.m4
Expand Up @@ -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
Expand All @@ -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])
Expand All @@ -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


Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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])
Expand Down
21 changes: 18 additions & 3 deletions ares/ares__timeval.c
Expand Up @@ -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;
}

Expand Down
21 changes: 18 additions & 3 deletions lib/timeval.c
Expand Up @@ -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;
}

Expand Down

0 comments on commit 97333de

Please sign in to comment.