From 92fb929a296f08ae5907940baaee7a02db14dc8f Mon Sep 17 00:00:00 2001 From: simon Date: Sun, 13 May 2012 15:59:27 +0000 Subject: [PATCH] Use clock_gettime(CLOCK_MONOTONIC) as the Unix getticks(), if it's available. git-svn-id: svn://svn.tartarus.org/sgt/putty@9529 cda61777-01e9-0310-a592-d414129be87e --- unix/configure.ac | 2 ++ unix/uxmisc.c | 26 ++++++++++++++++++++------ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/unix/configure.ac b/unix/configure.ac index a5185408..930f3e37 100644 --- a/unix/configure.ac +++ b/unix/configure.ac @@ -119,6 +119,8 @@ AC_CHECK_LIB(X11, XOpenDisplay, AC_DEFINE([HAVE_LIBX11],[],[Define if libX11.a is available])]) AC_CHECK_FUNCS([getaddrinfo ptsname setresuid strsignal updwtmpx]) +AC_CHECK_DECLS([CLOCK_MONOTONIC], [], [], [[#include ]]) +AC_SEARCH_LIBS([clock_gettime], [rt], [AC_DEFINE([HAVE_CLOCK_GETTIME],[],[Define if clock_gettime() is available])]) AC_OUTPUT diff --git a/unix/uxmisc.c b/unix/uxmisc.c index d11b2f74..01e1299d 100644 --- a/unix/uxmisc.c +++ b/unix/uxmisc.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -15,14 +16,27 @@ unsigned long getticks(void) { - struct timeval tv; - gettimeofday(&tv, NULL); /* - * We want to use milliseconds rather than microseconds, - * because we need a decent number of them to fit into a 32-bit - * word so it can be used for keepalives. + * We want to use milliseconds rather than the microseconds or + * nanoseconds given by the underlying clock functions, because we + * need a decent number of them to fit into a 32-bit word so it + * can be used for keepalives. */ - return tv.tv_sec * TICKSPERSEC + tv.tv_usec / (1000000 / TICKSPERSEC); +#if defined HAVE_CLOCK_GETTIME && defined HAVE_DECL_CLOCK_MONOTONIC + { + /* Use CLOCK_MONOTONIC if available, so as to be unconfused if + * the system clock changes. */ + struct timespec ts; + if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) + return ts.tv_sec * TICKSPERSEC + + ts.tv_nsec / (1000000 / TICKSPERSEC); + } +#endif + { + struct timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_sec * TICKSPERSEC + tv.tv_usec / (1000000 / TICKSPERSEC); + } } Filename *filename_from_str(const char *str) -- 2.11.0