int64_t delta;
assert(ts);
+ if (u == (usec_t) -1) {
+ ts->realtime = ts->monotonic = (usec_t) -1;
+ return ts;
+ }
+
ts->realtime = u;
if (u == 0)
return ts;
}
+dual_timestamp* dual_timestamp_from_monotonic(dual_timestamp *ts, usec_t u) {
+ int64_t delta;
+ assert(ts);
+
+ if (u == (usec_t) -1) {
+ ts->realtime = ts->monotonic = (usec_t) -1;
+ return ts;
+ }
+
+ ts->monotonic = u;
+ delta = (int64_t) now(CLOCK_MONOTONIC) - (int64_t) u;
+
+ ts->realtime = now(CLOCK_REALTIME);
+ if ((int64_t) ts->realtime > delta)
+ ts->realtime -= delta;
+ else
+ ts->realtime = 0;
+
+ return ts;
+}
+
usec_t timespec_load(const struct timespec *ts) {
assert(ts);
const char *suffix;
usec_t usec;
} table[] = {
+ { "y", USEC_PER_YEAR },
+ { "month", USEC_PER_MONTH },
{ "w", USEC_PER_WEEK },
{ "d", USEC_PER_DAY },
{ "h", USEC_PER_HOUR },
return p;
}
- /* The result of this function can be parsed with parse_usec */
+ /* The result of this function can be parsed with parse_sec */
for (i = 0; i < ELEMENTSOF(table); i++) {
int k;
} else if (t[0] == '+') {
- r = parse_usec(t+1, &plus);
+ r = parse_sec(t+1, &plus);
if (r < 0)
return r;
goto finish;
} else if (t[0] == '-') {
- r = parse_usec(t+1, &minus);
+ r = parse_sec(t+1, &minus);
if (r < 0)
return r;
if (!z)
return -ENOMEM;
- r = parse_usec(z, &minus);
+ r = parse_sec(z, &minus);
if (r < 0)
return r;
return 0;
}
-int parse_usec(const char *t, usec_t *usec) {
+int parse_sec(const char *t, usec_t *usec) {
static const struct {
const char *suffix;
usec_t usec;
errno = 0;
l = strtoll(p, &e, 10);
- if (errno != 0)
+ if (errno > 0)
return -errno;
if (l < 0)
errno = 0;
l = strtoll(p, &e, 10);
- if (errno != 0)
+ if (errno > 0)
return -errno;
if (l < 0)