diff options
author | Tom Gundersen <teg@jklm.no> | 2014-07-24 18:36:37 +0200 |
---|---|---|
committer | Tom Gundersen <teg@jklm.no> | 2014-07-24 19:02:58 +0200 |
commit | 77ff2de999b7ea6b1b4a3a218fbd9d62bb07cd54 (patch) | |
tree | 11d64d04929f55ceacc6fbbb7321cc6ff5801d69 /src | |
parent | a854881616afbe4c4f55396d3fc2f922bbbe716b (diff) |
time-util: add clock_boottime_or_monotonic
CLOCK_BOOTTIME is not supported by timerfd on older kernels, so for the time beeing,
use this helper instead which will fallback to CLOCK_MONOTONIC if CLOCK_BOOTTIME is
not supported.
Diffstat (limited to 'src')
-rw-r--r-- | src/shared/time-util.c | 19 | ||||
-rw-r--r-- | src/shared/time-util.h | 2 |
2 files changed, 21 insertions, 0 deletions
diff --git a/src/shared/time-util.c b/src/shared/time-util.c index fc79c569f4..76ab143f34 100644 --- a/src/shared/time-util.c +++ b/src/shared/time-util.c @@ -22,6 +22,7 @@ #include <time.h> #include <string.h> #include <sys/timex.h> +#include <sys/timerfd.h> #include "util.h" #include "time-util.h" @@ -929,3 +930,21 @@ bool timezone_is_valid(const char *name) { return true; } + +clockid_t clock_boottime_or_monotonic(void) { + static clockid_t clock = -1; + int fd; + + if (clock != -1) + return clock; + + fd = timerfd_create(CLOCK_BOOTTIME, TFD_NONBLOCK|TFD_CLOEXEC); + if (fd < 0) + clock = CLOCK_MONOTONIC; + else { + safe_close(fd); + clock = CLOCK_BOOTTIME; + } + + return clock; +} diff --git a/src/shared/time-util.h b/src/shared/time-util.h index 792cd27489..69a48c686b 100644 --- a/src/shared/time-util.h +++ b/src/shared/time-util.h @@ -98,3 +98,5 @@ bool ntp_synced(void); int get_timezones(char ***l); bool timezone_is_valid(const char *name); + +clockid_t clock_boottime_or_monotonic(void); |