summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Gundersen <teg@jklm.no>2014-07-24 18:36:37 +0200
committerTom Gundersen <teg@jklm.no>2014-07-24 19:02:58 +0200
commit77ff2de999b7ea6b1b4a3a218fbd9d62bb07cd54 (patch)
tree11d64d04929f55ceacc6fbbb7321cc6ff5801d69
parenta854881616afbe4c4f55396d3fc2f922bbbe716b (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.
-rw-r--r--src/shared/time-util.c19
-rw-r--r--src/shared/time-util.h2
2 files changed, 21 insertions, 0 deletions
diff --git a/src/shared/time-util.c b/src/shared/time-util.c
index fc79c569f..76ab143f3 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 792cd2748..69a48c686 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);