X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=liblttng-ust%2Fclock.h;h=b68e563f6206b1eb6394011dfd96522d3587f9c7;hb=c0c0989ab70574e09b2f7e8b48c2da6af664a849;hp=ed191b0bf9b7ca4b75a55ddbb17682e052b0ad4c;hpb=35897f8b2d311b756b81657dad9c53ef1c0fad8a;p=lttng-ust.git diff --git a/liblttng-ust/clock.h b/liblttng-ust/clock.h index ed191b0b..b68e563f 100644 --- a/liblttng-ust/clock.h +++ b/liblttng-ust/clock.h @@ -1,20 +1,8 @@ /* - * Copyright (C) 2010 Pierre-Marc Fournier - * Copyright (C) 2011 Mathieu Desnoyers + * SPDX-License-Identifier: LGPL-2.1-only * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; version 2.1 of - * the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * Copyright (C) 2010 Pierre-Marc Fournier + * Copyright (C) 2011 Mathieu Desnoyers */ #ifndef _UST_CLOCK_H @@ -24,34 +12,50 @@ #include #include #include +#include +#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); +}; -/* Choosing correct trace clock */ +extern struct lttng_trace_clock *lttng_trace_clock; -static __inline__ uint64_t trace_clock_read64(void) -{ - struct timespec ts; +void lttng_ust_clock_init(void); - clock_gettime(CLOCK_MONOTONIC, &ts); - return (ts.tv_sec * 1000000000) + ts.tv_nsec; -} +/* Use the kernel MONOTONIC clock. */ -#if __i386__ || __x86_64__ -static __inline__ uint64_t trace_clock_frequency(void) +static __inline__ +uint64_t trace_clock_read64_monotonic(void) { - return 1000000000LL; + 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; } -#endif /* #else #if __i386__ || __x86_64__ */ -static __inline__ uint32_t trace_clock_freq_scale(void) +static __inline__ +uint64_t trace_clock_read64(void) { - return 1; + 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(); + } } #endif /* _UST_CLOCK_H */