clock: add clock description to metadata
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 27 Jan 2012 02:32:03 +0000 (21:32 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 27 Jan 2012 02:32:03 +0000 (21:32 -0500)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
liblttng-ust/clock.h
liblttng-ust/ltt-events.c

index 23294d2b8c2fdf771d043e775b83664ab3d19549..95e3e43b16d0863f412c10082151f3c924ab9cbe 100644 (file)
@@ -34,7 +34,8 @@
 
 /* Choosing correct trace clock */
 
-static __inline__ uint64_t trace_clock_read64(void)
+static __inline__
+uint64_t trace_clock_read64(void)
 {
        struct timespec ts;
 
@@ -42,9 +43,16 @@ static __inline__ uint64_t trace_clock_read64(void)
        return ((uint64_t) ts.tv_sec * 1000000000ULL) + ts.tv_nsec;
 }
 
-static __inline__ uint32_t trace_clock_freq_scale(void)
+static __inline__
+uint64_t trace_clock_freq(void)
 {
-       return 1;
+       return 1000000000ULL;
+}
+
+static __inline__
+const char *trace_clock_uuid(void)
+{
+       return "CLOCK_MONOTONIC";
 }
 
 #endif /* _UST_CLOCK_H */
index 9751089c564f6830cb449eceb084200593dab2ae..7d2dc31a8ebc0898a7c493f0cbfbb5b7fb9d6602 100644 (file)
@@ -20,6 +20,9 @@
 #include <sys/ipc.h>
 #include <stdint.h>
 #include <stddef.h>
+#include <inttypes.h>
+#include <time.h>
+#include "clock.h"
 
 #include <urcu-bp.h>
 #include <urcu/compiler.h>
@@ -987,8 +990,8 @@ int _ltt_stream_packet_context_declare(struct ltt_session *session)
 {
        return lttng_metadata_printf(session,
                "struct packet_context {\n"
-               "       uint64_t timestamp_begin;\n"
-               "       uint64_t timestamp_end;\n"
+               "       uint64_clock_monotonic_t timestamp_begin;\n"
+               "       uint64_clock_monotonic_t timestamp_end;\n"
                "       uint32_t events_discarded;\n"
                "       uint32_t content_size;\n"
                "       uint32_t packet_size;\n"
@@ -1014,11 +1017,11 @@ int _ltt_event_header_declare(struct ltt_session *session)
        "       enum : uint5_t { compact = 0 ... 30, extended = 31 } id;\n"
        "       variant <id> {\n"
        "               struct {\n"
-       "                       uint27_t timestamp;\n"
+       "                       uint27_clock_monotonic_t timestamp;\n"
        "               } compact;\n"
        "               struct {\n"
        "                       uint32_t id;\n"
-       "                       uint64_t timestamp;\n"
+       "                       uint64_clock_monotonic_t timestamp;\n"
        "               } extended;\n"
        "       } v;\n"
        "} align(%u);\n"
@@ -1027,11 +1030,11 @@ int _ltt_event_header_declare(struct ltt_session *session)
        "       enum : uint16_t { compact = 0 ... 65534, extended = 65535 } id;\n"
        "       variant <id> {\n"
        "               struct {\n"
-       "                       uint32_t timestamp;\n"
+       "                       uint32_clock_monotonic_t timestamp;\n"
        "               } compact;\n"
        "               struct {\n"
        "                       uint32_t id;\n"
-       "                       uint64_t timestamp;\n"
+       "                       uint64_clock_monotonic_t timestamp;\n"
        "               } extended;\n"
        "       } v;\n"
        "} align(%u);\n\n",
@@ -1040,6 +1043,31 @@ int _ltt_event_header_declare(struct ltt_session *session)
        );
 }
 
+/*
+ * Approximation of NTP time of day to clock monotonic correlation,
+ * taken at start of trace.
+ * Yes, this is only an approximation. Yes, we can (and will) do better
+ * in future versions.
+ */
+static
+uint64_t measure_clock_offset(void)
+{
+       uint64_t offset, monotonic[2], realtime;
+       struct timespec rts = { 0, 0 };
+       int ret;
+
+       monotonic[0] = trace_clock_read64();
+       ret = clock_gettime(CLOCK_REALTIME, &rts);      
+       if (ret < 0)
+               return 0;
+       monotonic[1] = trace_clock_read64();
+       offset = (monotonic[0] + monotonic[1]) >> 1;
+       realtime = rts.tv_sec * 1000000000ULL;
+       realtime += rts.tv_nsec;
+       offset = realtime - offset;
+       return offset;
+}
+
 /*
  * Output metadata into this session's metadata buffers.
  */
@@ -1103,6 +1131,44 @@ int _ltt_session_metadata_statedump(struct ltt_session *session)
        if (ret)
                goto end;
 
+       ret = lttng_metadata_printf(session,
+               "clock {\n"
+               "       name = %s;\n"
+               "       uuid = %s;\n"
+               "       description = \"Monotonic Clock\";\n"
+               "       freq = %" PRIu64 "; /* Frequency, in Hz */\n"
+               "       /* clock value offset from Epoch is: offset * (1/freq) */\n"
+               "       offset = %" PRIu64 ";\n"
+               "};\n\n",
+               "monotonic",
+               trace_clock_uuid(),
+               trace_clock_freq(),
+               measure_clock_offset()
+               );
+       if (ret)
+               goto end;
+
+       ret = lttng_metadata_printf(session,
+               "typealias integer {\n"
+               "       size = 27; align = 1; signed = false;\n"
+               "       map = clock.monotonic.value;\n"
+               "} := uint27_clock_monotonic_t;\n"
+               "\n"
+               "typealias integer {\n"
+               "       size = 32; align = %u; signed = false;\n"
+               "       map = clock.monotonic.value;\n"
+               "} := uint32_clock_monotonic_t;\n"
+               "\n"
+               "typealias integer {\n"
+               "       size = 64; align = %u; signed = false;\n"
+               "       map = clock.monotonic.value;\n"
+               "} := uint64_clock_monotonic_t;\n\n",
+               lttng_alignof(uint32_t) * CHAR_BIT,
+               lttng_alignof(uint64_t) * CHAR_BIT
+               );
+       if (ret)
+               goto end;
+
        ret = _ltt_stream_packet_context_declare(session);
        if (ret)
                goto end;
This page took 0.027885 seconds and 4 git commands to generate.