Use boot_id as monotonic clock uuid
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 30 Jan 2012 14:02:04 +0000 (09:02 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Mon, 30 Jan 2012 14:02:04 +0000 (09:02 -0500)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
liblttng-ust/clock.h
liblttng-ust/ltt-events.c

index 95e3e43b16d0863f412c10082151f3c924ab9cbe..82a7b45cd5294a3f35c63e172ea8105d0e5c2e0d 100644 (file)
 #include <sys/time.h>
 #include <stdint.h>
 #include <stddef.h>
+#include <stdio.h>
+
+/*
+ * Includes final \0.
+ */
+#define CLOCK_UUID_LEN         37
 
 /* TRACE CLOCK */
 
@@ -50,9 +56,30 @@ uint64_t trace_clock_freq(void)
 }
 
 static __inline__
-const char *trace_clock_uuid(void)
+const int trace_clock_uuid(char *uuid)
 {
-       return "CLOCK_MONOTONIC";
+       int ret = 0;
+       size_t len;
+       FILE *fp;
+
+       /*
+        * boot_id needs to be read once before being used concurrently
+        * to deal with a Linux kernel race. A fix is proposed for
+        * upstream, but the work-around is needed for older kernels.
+        */
+       fp = fopen("/proc/sys/kernel/random/boot_id", "r");
+       if (!fp) {
+               return -ENOENT;
+       }
+       len = fread(uuid, 1, CLOCK_UUID_LEN - 1, fp);
+       if (len < CLOCK_UUID_LEN - 1) {
+               ret = -EINVAL;
+               goto end;
+       }
+       uuid[CLOCK_UUID_LEN - 1] = '\0';
+end:
+       fclose(fp);
+       return ret;
 }
 
 #endif /* _UST_CLOCK_H */
index 7d2dc31a8ebc0898a7c493f0cbfbb5b7fb9d6602..85afc1ba63599027ea930d4aea52a0f07856241c 100644 (file)
@@ -1075,7 +1075,7 @@ static
 int _ltt_session_metadata_statedump(struct ltt_session *session)
 {
        unsigned char *uuid_c = session->uuid;
-       char uuid_s[37];
+       char uuid_s[37], clock_uuid_s[CLOCK_UUID_LEN];
        struct ltt_channel *chan;
        struct ltt_event *event;
        int ret = 0;
@@ -1133,15 +1133,27 @@ int _ltt_session_metadata_statedump(struct ltt_session *session)
 
        ret = lttng_metadata_printf(session,
                "clock {\n"
-               "       name = %s;\n"
-               "       uuid = %s;\n"
+               "       name = %s;\n",
+               "monotonic"
+               );
+       if (ret)
+               goto end;
+
+       if (!trace_clock_uuid(clock_uuid_s)) {
+               ret = lttng_metadata_printf(session,
+                       "       uuid = \"%s\";\n",
+                       clock_uuid_s
+                       );
+               if (ret)
+                       goto end;
+       }
+
+       ret = lttng_metadata_printf(session,
                "       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()
                );
This page took 0.026775 seconds and 4 git commands to generate.