#include <sys/time.h>
#include <stdint.h>
#include <stddef.h>
+#include <stdio.h>
+
+/*
+ * Includes final \0.
+ */
+#define CLOCK_UUID_LEN 37
/* TRACE CLOCK */
}
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 */
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;
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()
);