summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/manager.c1
-rw-r--r--src/shared/time-util.c26
-rw-r--r--src/shared/time-util.h1
3 files changed, 28 insertions, 0 deletions
diff --git a/src/core/manager.c b/src/core/manager.c
index 3a4023f31a..df0fd63e87 100644
--- a/src/core/manager.c
+++ b/src/core/manager.c
@@ -301,6 +301,7 @@ int manager_new(SystemdRunningAs running_as, Manager **_m) {
return -ENOMEM;
dual_timestamp_get(&m->userspace_timestamp);
+ dual_timestamp_from_monotonic(&m->kernel_timestamp, 0);
m->running_as = running_as;
m->name_data_slot = m->conn_data_slot = m->subscribed_data_slot = -1;
diff --git a/src/shared/time-util.c b/src/shared/time-util.c
index 13d57ba5cd..4fd8f08984 100644
--- a/src/shared/time-util.c
+++ b/src/shared/time-util.c
@@ -46,6 +46,11 @@ dual_timestamp* dual_timestamp_from_realtime(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->realtime = u;
if (u == 0)
@@ -64,6 +69,27 @@ dual_timestamp* dual_timestamp_from_realtime(dual_timestamp *ts, usec_t u) {
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);
diff --git a/src/shared/time-util.h b/src/shared/time-util.h
index 7194875ec2..ec263c1a19 100644
--- a/src/shared/time-util.h
+++ b/src/shared/time-util.h
@@ -61,6 +61,7 @@ usec_t now(clockid_t clock);
dual_timestamp* dual_timestamp_get(dual_timestamp *ts);
dual_timestamp* dual_timestamp_from_realtime(dual_timestamp *ts, usec_t u);
+dual_timestamp* dual_timestamp_from_monotonic(dual_timestamp *ts, usec_t u);
#define dual_timestamp_is_set(ts) ((ts)->realtime > 0)