X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=liblttng-ust%2Fclock.h;h=388ed658cbb9761a3c206c890ed620a396d3f92b;hb=ce90ea45ccb269066ac1662f0ed7b451cb380de7;hp=b4d17e785e164e3ae9a59c89fd7a897853754bc8;hpb=ff0545c9666d3f76db2ab1da1cf5073cf1ecfc45;p=lttng-ust.git diff --git a/liblttng-ust/clock.h b/liblttng-ust/clock.h index b4d17e78..388ed658 100644 --- a/liblttng-ust/clock.h +++ b/liblttng-ust/clock.h @@ -25,19 +25,28 @@ #include #include #include -#include "uuid.h" +#include +#include +#include -/* TRACE CLOCK */ +#include "lttng-ust-uuid.h" -/* - * Currently using the kernel MONOTONIC clock, waiting for kernel-side - * LTTng to implement mmap'd 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); +}; + +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; @@ -46,13 +55,13 @@ uint64_t trace_clock_read64(void) } static __inline__ -uint64_t trace_clock_freq(void) +uint64_t trace_clock_freq_monotonic(void) { return 1000000000ULL; } static __inline__ -const int trace_clock_uuid(char *uuid) +int trace_clock_uuid_monotonic(char *uuid) { int ret = 0; size_t len; @@ -78,4 +87,82 @@ end: return ret; } +static __inline__ +const char *trace_clock_name_monotonic(void) +{ + return "monotonic"; +} + +static __inline__ +const char *trace_clock_description_monotonic(void) +{ + return "Monotonic Clock"; +} + +static __inline__ +uint64_t trace_clock_read64(void) +{ + struct lttng_trace_clock *ltc = CMM_LOAD_SHARED(lttng_trace_clock); + + if (caa_likely(!ltc)) { + return trace_clock_read64_monotonic(); + } else { + cmm_read_barrier_depends(); /* load ltc before content */ + return ltc->read64(); + } +} + +static __inline__ +uint64_t trace_clock_freq(void) +{ + struct lttng_trace_clock *ltc = CMM_LOAD_SHARED(lttng_trace_clock); + + if (!ltc) { + return trace_clock_freq_monotonic(); + } else { + cmm_read_barrier_depends(); /* load ltc before content */ + return ltc->freq(); + } +} + +static __inline__ +int trace_clock_uuid(char *uuid) +{ + struct lttng_trace_clock *ltc = CMM_LOAD_SHARED(lttng_trace_clock); + + cmm_read_barrier_depends(); /* load ltc before content */ + /* Use default UUID cb when NULL */ + if (!ltc || !ltc->uuid) { + return trace_clock_uuid_monotonic(uuid); + } else { + return ltc->uuid(uuid); + } +} + +static __inline__ +const char *trace_clock_name(void) +{ + struct lttng_trace_clock *ltc = CMM_LOAD_SHARED(lttng_trace_clock); + + if (!ltc) { + return trace_clock_name_monotonic(); + } else { + cmm_read_barrier_depends(); /* load ltc before content */ + return ltc->name(); + } +} + +static __inline__ +const char *trace_clock_description(void) +{ + struct lttng_trace_clock *ltc = CMM_LOAD_SHARED(lttng_trace_clock); + + if (!ltc) { + return trace_clock_description_monotonic(); + } else { + cmm_read_barrier_depends(); /* load ltc before content */ + return ltc->description(); + } +} + #endif /* _UST_CLOCK_H */