From 3e358475bb500dd3811616ee3c62f9a56070392a Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Thu, 19 Mar 2020 14:19:22 +0100 Subject: [PATCH] time: Allow using different clocks On some systems it might be preferable to use e.g. CLOCK_BOOTTIME instead of CLOCK_MONOTONIC, which is also not affected by time adjustments but includes times when the system was suspended. --- src/libstrongswan/threading/mutex.c | 2 +- src/libstrongswan/utils/utils/time.c | 2 +- src/libstrongswan/utils/utils/time.h | 14 ++++++++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/libstrongswan/threading/mutex.c b/src/libstrongswan/threading/mutex.c index 70db30f21..888f11df0 100644 --- a/src/libstrongswan/threading/mutex.c +++ b/src/libstrongswan/threading/mutex.c @@ -337,7 +337,7 @@ condvar_t *condvar_create(condvar_type_t type) pthread_condattr_t condattr; pthread_condattr_init(&condattr); #ifdef HAVE_CONDATTR_CLOCK_MONOTONIC - pthread_condattr_setclock(&condattr, CLOCK_MONOTONIC); + pthread_condattr_setclock(&condattr, TIME_CLOCK_ID); #endif pthread_cond_init(&this->condvar, &condattr); pthread_condattr_destroy(&condattr); diff --git a/src/libstrongswan/utils/utils/time.c b/src/libstrongswan/utils/utils/time.c index d96c918da..c1e055e91 100644 --- a/src/libstrongswan/utils/utils/time.c +++ b/src/libstrongswan/utils/utils/time.c @@ -52,7 +52,7 @@ time_t time_monotonic(timeval_t *tv) * monotonic time source only if it is also supported by pthread. */ timespec_t ts; - if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) + if (clock_gettime(TIME_CLOCK_ID, &ts) == 0) { if (tv) { diff --git a/src/libstrongswan/utils/utils/time.h b/src/libstrongswan/utils/utils/time.h index 2e210fbef..9fac77729 100644 --- a/src/libstrongswan/utils/utils/time.h +++ b/src/libstrongswan/utils/utils/time.h @@ -32,6 +32,20 @@ */ #define TIME_32_BIT_SIGNED_MAX 0x7fffffff +/** + * The clock that should be used for time_monotonic() and conditional variables + */ +#ifdef HAVE_CLOCK_GETTIME +#ifdef HAVE_CONDATTR_CLOCK_MONOTONIC +/* only can use different clocks if we can set it via attribute */ +#ifndef TIME_CLOCK_ID +#define TIME_CLOCK_ID CLOCK_MONOTONIC +#endif +#else +#define TIME_CLOCK_ID CLOCK_MONOTONIC +#endif +#endif + /** * Handle struct timeval like an own type. */