X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=liblttng-ust%2Fclock.h;h=0ea73e9d43ee9658bcc9d4d1c39cf2206477f31e;hb=6a57ced16762ef92afe5c273a1a22a147f27d2bd;hp=23294d2b8c2fdf771d043e775b83664ab3d19549;hpb=dc190cc1f8ddccfa7b0b8323ed157afb29a0ebb7;p=lttng-ust.git diff --git a/liblttng-ust/clock.h b/liblttng-ust/clock.h index 23294d2b..0ea73e9d 100644 --- a/liblttng-ust/clock.h +++ b/liblttng-ust/clock.h @@ -24,6 +24,8 @@ #include #include #include +#include +#include "lttng-ust-uuid.h" /* TRACE CLOCK */ @@ -34,17 +36,49 @@ /* 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 */