chiark / gitweb /
core: properly initialize kernel timestamp
authorLennart Poettering <lennart@poettering.net>
Tue, 8 Jan 2013 00:27:39 +0000 (01:27 +0100)
committerLennart Poettering <lennart@poettering.net>
Tue, 8 Jan 2013 00:27:39 +0000 (01:27 +0100)
src/core/manager.c
src/shared/time-util.c
src/shared/time-util.h

index 3a4023f..df0fd63 100644 (file)
@@ -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;
index 13d57ba..4fd8f08 100644 (file)
@@ -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);
 
index 7194875..ec263c1 100644 (file)
@@ -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)