X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=liblttng-ust%2Fclock.h;h=d5548e90e4fe9a301f06fd6dc86ad400c80ff091;hb=41d1e173b52e80030b05ce7f25a45ae59765e40e;hp=88eca432a5733f7e4bc35f1878b911617a5119d5;hpb=e3feda7db3de3530e7c9c511536c36cccf317013;p=lttng-ust.git diff --git a/liblttng-ust/clock.h b/liblttng-ust/clock.h index 88eca432..d5548e90 100644 --- a/liblttng-ust/clock.h +++ b/liblttng-ust/clock.h @@ -25,57 +25,49 @@ #include #include #include +#include +#include +#include + #include "lttng-ust-uuid.h" -/* TRACE CLOCK */ +struct lttng_trace_clock { + uint64_t (*read64)(void); + uint64_t (*freq)(void); + int (*uuid)(char *uuid); + const char *(*name)(void); + const char *(*description)(void); +}; -/* - * Currently using the kernel MONOTONIC clock, waiting for kernel-side - * LTTng to implement mmap'd trace clock. - */ +extern struct lttng_trace_clock *lttng_trace_clock; -/* Choosing correct trace clock */ +void lttng_ust_clock_init(void); + +/* Use the kernel MONOTONIC clock. */ static __inline__ -uint64_t trace_clock_read64(void) +uint64_t trace_clock_read64_monotonic(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__ -uint64_t trace_clock_freq(void) -{ - return 1000000000ULL; -} - -static __inline__ -int trace_clock_uuid(char *uuid) +uint64_t trace_clock_read64(void) { - int ret = 0; - size_t len; - FILE *fp; + struct lttng_trace_clock *ltc = CMM_LOAD_SHARED(lttng_trace_clock); - /* - * 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; + if (caa_likely(!ltc)) { + return trace_clock_read64_monotonic(); + } else { + cmm_read_barrier_depends(); /* load ltc before content */ + return ltc->read64(); } - uuid[LTTNG_UST_UUID_STR_LEN - 1] = '\0'; -end: - fclose(fp); - return ret; } #endif /* _UST_CLOCK_H */