X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=src%2Fcommon%2Fclock.h;h=e9407f2608cd154ee3c602411868bedcc90b91e3;hb=f41a6b5f307db311352f79d35f0656959db60891;hp=a0bf24991c2e43654463ddfb4b41244a04dbb7c0;hpb=08ba2503b86d1506117c077c99eb1c38973a48f3;p=lttng-ust.git diff --git a/src/common/clock.h b/src/common/clock.h index a0bf2499..e9407f26 100644 --- a/src/common/clock.h +++ b/src/common/clock.h @@ -7,9 +7,56 @@ #ifndef _UST_COMMON_CLOCK_H #define _UST_COMMON_CLOCK_H +#include +#include +#include +#include +#include + +#include +#include +#include + +struct lttng_ust_trace_clock { + uint64_t (*read64)(void); + uint64_t (*freq)(void); + int (*uuid)(char *uuid); + const char *(*name)(void); + const char *(*description)(void); +}; + /* - * Part of the private ABI between liblttng-ust and liblttng-ust-ctl. + * The trace clock is a public symbol of liblttng-ust-common accessed by other + * libraries through the trace_clock_read64 static inline function. It is + * initialised in the liblttng-ust-common constructor. */ -void lttng_ust_clock_init(void); +extern struct lttng_ust_trace_clock *lttng_ust_trace_clock; + +/* Use the kernel MONOTONIC clock. */ + +static __inline__ +uint64_t trace_clock_read64_monotonic(void) +{ + struct timespec 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_read64(void) +{ + struct lttng_ust_trace_clock *ltc = CMM_LOAD_SHARED(lttng_ust_trace_clock); + + if (caa_likely(!ltc)) { + return trace_clock_read64_monotonic(); + } else { + cmm_read_barrier_depends(); /* load ltc before content */ + return ltc->read64(); + } +} #endif /* _UST_COMMON_CLOCK_H */