Fix: unchecked return value in trace_clock_read64_monotonic
[lttng-ust.git] / liblttng-ust / clock.h
index 23294d2b8c2fdf771d043e775b83664ab3d19549..0ea73e9d43ee9658bcc9d4d1c39cf2206477f31e 100644 (file)
@@ -24,6 +24,8 @@
 #include <sys/time.h>
 #include <stdint.h>
 #include <stddef.h>
+#include <stdio.h>
+#include "lttng-ust-uuid.h"
 
 /* TRACE CLOCK */
 
 
 /* Choosing correct trace clock */
 
-static __inline__ uint64_t trace_clock_read64(void)
+static __inline__
+uint64_t trace_clock_read64(void)
 {
        struct timespec ts;
 
-       clock_gettime(CLOCK_MONOTONIC, &ts);
+       if (caa_unlikely(clock_gettime(CLOCK_MONOTONIC, &ts))) {
+               ts.tv_sec = 0;
+               ts.tv_nsec = 0;
+       }
        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__
+int trace_clock_uuid(char *uuid)
+{
+       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, LTTNG_UST_UUID_STR_LEN - 1, fp);
+       if (len < LTTNG_UST_UUID_STR_LEN - 1) {
+               ret = -EINVAL;
+               goto end;
+       }
+       uuid[LTTNG_UST_UUID_STR_LEN - 1] = '\0';
+end:
+       fclose(fp);
+       return ret;
 }
 
 #endif /* _UST_CLOCK_H */
This page took 0.022937 seconds and 4 git commands to generate.