#include <time.h>
#include <string.h>
#include <sys/timex.h>
+#include <sys/timerfd.h>
#include "util.h"
#include "time-util.h"
int64_t delta;
assert(ts);
- if (u == (usec_t) -1) {
- ts->realtime = ts->monotonic = (usec_t) -1;
+ if (u == USEC_INFINITY) {
+ ts->realtime = ts->monotonic = USEC_INFINITY;
return ts;
}
int64_t delta;
assert(ts);
- if (u == (usec_t) -1) {
- ts->realtime = ts->monotonic = (usec_t) -1;
+ if (u == USEC_INFINITY) {
+ ts->realtime = ts->monotonic = USEC_INFINITY;
return ts;
}
if (ts->tv_sec == (time_t) -1 &&
ts->tv_nsec == (long) -1)
- return (usec_t) -1;
+ return USEC_INFINITY;
if ((usec_t) ts->tv_sec > (UINT64_MAX - (ts->tv_nsec / NSEC_PER_USEC)) / USEC_PER_SEC)
- return (usec_t) -1;
+ return USEC_INFINITY;
return
(usec_t) ts->tv_sec * USEC_PER_SEC +
struct timespec *timespec_store(struct timespec *ts, usec_t u) {
assert(ts);
- if (u == (usec_t) -1) {
+ if (u == USEC_INFINITY) {
ts->tv_sec = (time_t) -1;
ts->tv_nsec = (long) -1;
return ts;
if (tv->tv_sec == (time_t) -1 &&
tv->tv_usec == (suseconds_t) -1)
- return (usec_t) -1;
+ return USEC_INFINITY;
if ((usec_t) tv->tv_sec > (UINT64_MAX - tv->tv_usec) / USEC_PER_SEC)
- return (usec_t) -1;
+ return USEC_INFINITY;
return
(usec_t) tv->tv_sec * USEC_PER_SEC +
struct timeval *timeval_store(struct timeval *tv, usec_t u) {
assert(tv);
- if (u == (usec_t) -1) {
+ if (u == USEC_INFINITY) {
tv->tv_sec = (time_t) -1;
tv->tv_usec = (suseconds_t) -1;
} else {
assert(buf);
assert(l > 0);
- if (t <= 0 || t == (usec_t) -1)
+ if (t <= 0 || t == USEC_INFINITY)
return NULL;
sec = (time_t) (t / USEC_PER_SEC);
assert(buf);
assert(l > 0);
- if (t <= 0 || t == (usec_t) -1)
+ if (t <= 0 || t == USEC_INFINITY)
return NULL;
sec = (time_t) (t / USEC_PER_SEC);
n = now(CLOCK_REALTIME);
- if (t <= 0 || (t == (usec_t) -1))
+ if (t <= 0 || (t == USEC_INFINITY))
return NULL;
if (n > t) {
assert(buf);
assert(l > 0);
- if (t == (usec_t) -1)
+ if (t == USEC_INFINITY)
return NULL;
if (t <= 0) {
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;
+}