X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=unix%2Fuxmisc.c;h=300fc543762140ba69065a4f3518e4aab9efda3b;hb=a580c22c2419a9236466ca8ee80bc97bc9da41eb;hp=d11b2f74f5d7a85f1d4826ff7e5965753892bb94;hpb=aba05b7180b39ee51d72b1da867303c002188f2c;p=PuTTY.git diff --git a/unix/uxmisc.c b/unix/uxmisc.c index d11b2f74..300fc543 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 / (1000000000 / 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)