Fix: handle negative clock offset
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 8 Feb 2016 21:38:46 +0000 (16:38 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 8 Feb 2016 21:49:42 +0000 (16:49 -0500)
In the unlikely situation where a system sets its hardware clock
(CLOCK_REALTIME) to 0 (Epoch) after boot, the difference

  monotonic - realtime

becomes negative.

Fixup this situation by returning a 0 offset in this case.

This ensures that trace viewer implementations (e.g. babeltrace) which
currently cannot handle the negative offset (known bug) still work with
the generated traces.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
lttng-events.c

index d0ebb2987518fd61b68cd6455602c3a39c8135c6..aac9c5899355df496ec5a31f9635b43918220726 100644 (file)
@@ -1960,11 +1960,14 @@ int _lttng_event_header_declare(struct lttng_session *session)
  * taken at start of trace.
  * Yes, this is only an approximation. Yes, we can (and will) do better
  * in future versions.
+ * Return 0 if offset is negative. It may happen if the system sets
+ * the REALTIME clock to 0 after boot.
  */
 static
 uint64_t measure_clock_offset(void)
 {
-       uint64_t offset, monotonic[2], realtime;
+       uint64_t monotonic_avg, monotonic[2], realtime;
+       int64_t offset;
        struct timespec rts = { 0, 0 };
        unsigned long flags;
 
@@ -1975,10 +1978,12 @@ uint64_t measure_clock_offset(void)
        monotonic[1] = trace_clock_read64();
        local_irq_restore(flags);
 
-       offset = (monotonic[0] + monotonic[1]) >> 1;
+       monotonic_avg = (monotonic[0] + monotonic[1]) >> 1;
        realtime = (uint64_t) rts.tv_sec * NSEC_PER_SEC;
        realtime += rts.tv_nsec;
-       offset = realtime - offset;
+       offset = (int64_t) realtime - monotonic_avg;
+       if (offset < 0)
+               return 0;
        return offset;
 }
 
This page took 0.027263 seconds and 4 git commands to generate.