From 28b120498f554e2478806c27f7bf7ab295f3ffdf Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Thu, 26 Jan 2012 21:32:03 -0500 Subject: [PATCH] clock: add clock description to metadata Signed-off-by: Mathieu Desnoyers --- liblttng-ust/clock.h | 14 +++++-- liblttng-ust/ltt-events.c | 78 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 83 insertions(+), 9 deletions(-) diff --git a/liblttng-ust/clock.h b/liblttng-ust/clock.h index 23294d2b..95e3e43b 100644 --- a/liblttng-ust/clock.h +++ b/liblttng-ust/clock.h @@ -34,7 +34,8 @@ /* Choosing correct trace clock */ -static __inline__ uint64_t trace_clock_read64(void) +static __inline__ +uint64_t trace_clock_read64(void) { struct timespec ts; @@ -42,9 +43,16 @@ static __inline__ uint64_t trace_clock_read64(void) 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__ +const char *trace_clock_uuid(void) +{ + return "CLOCK_MONOTONIC"; } #endif /* _UST_CLOCK_H */ diff --git a/liblttng-ust/ltt-events.c b/liblttng-ust/ltt-events.c index 9751089c..7d2dc31a 100644 --- a/liblttng-ust/ltt-events.c +++ b/liblttng-ust/ltt-events.c @@ -20,6 +20,9 @@ #include #include #include +#include +#include +#include "clock.h" #include #include @@ -987,8 +990,8 @@ int _ltt_stream_packet_context_declare(struct ltt_session *session) { return lttng_metadata_printf(session, "struct packet_context {\n" - " uint64_t timestamp_begin;\n" - " uint64_t timestamp_end;\n" + " uint64_clock_monotonic_t timestamp_begin;\n" + " uint64_clock_monotonic_t timestamp_end;\n" " uint32_t events_discarded;\n" " uint32_t content_size;\n" " uint32_t packet_size;\n" @@ -1014,11 +1017,11 @@ int _ltt_event_header_declare(struct ltt_session *session) " enum : uint5_t { compact = 0 ... 30, extended = 31 } id;\n" " variant {\n" " struct {\n" - " uint27_t timestamp;\n" + " uint27_clock_monotonic_t timestamp;\n" " } compact;\n" " struct {\n" " uint32_t id;\n" - " uint64_t timestamp;\n" + " uint64_clock_monotonic_t timestamp;\n" " } extended;\n" " } v;\n" "} align(%u);\n" @@ -1027,11 +1030,11 @@ int _ltt_event_header_declare(struct ltt_session *session) " enum : uint16_t { compact = 0 ... 65534, extended = 65535 } id;\n" " variant {\n" " struct {\n" - " uint32_t timestamp;\n" + " uint32_clock_monotonic_t timestamp;\n" " } compact;\n" " struct {\n" " uint32_t id;\n" - " uint64_t timestamp;\n" + " uint64_clock_monotonic_t timestamp;\n" " } extended;\n" " } v;\n" "} align(%u);\n\n", @@ -1040,6 +1043,31 @@ int _ltt_event_header_declare(struct ltt_session *session) ); } +/* + * Approximation of NTP time of day to clock monotonic correlation, + * taken at start of trace. + * Yes, this is only an approximation. Yes, we can (and will) do better + * in future versions. + */ +static +uint64_t measure_clock_offset(void) +{ + uint64_t offset, monotonic[2], realtime; + struct timespec rts = { 0, 0 }; + int ret; + + monotonic[0] = trace_clock_read64(); + ret = clock_gettime(CLOCK_REALTIME, &rts); + if (ret < 0) + return 0; + monotonic[1] = trace_clock_read64(); + offset = (monotonic[0] + monotonic[1]) >> 1; + realtime = rts.tv_sec * 1000000000ULL; + realtime += rts.tv_nsec; + offset = realtime - offset; + return offset; +} + /* * Output metadata into this session's metadata buffers. */ @@ -1103,6 +1131,44 @@ int _ltt_session_metadata_statedump(struct ltt_session *session) if (ret) goto end; + ret = lttng_metadata_printf(session, + "clock {\n" + " name = %s;\n" + " uuid = %s;\n" + " description = \"Monotonic Clock\";\n" + " freq = %" PRIu64 "; /* Frequency, in Hz */\n" + " /* clock value offset from Epoch is: offset * (1/freq) */\n" + " offset = %" PRIu64 ";\n" + "};\n\n", + "monotonic", + trace_clock_uuid(), + trace_clock_freq(), + measure_clock_offset() + ); + if (ret) + goto end; + + ret = lttng_metadata_printf(session, + "typealias integer {\n" + " size = 27; align = 1; signed = false;\n" + " map = clock.monotonic.value;\n" + "} := uint27_clock_monotonic_t;\n" + "\n" + "typealias integer {\n" + " size = 32; align = %u; signed = false;\n" + " map = clock.monotonic.value;\n" + "} := uint32_clock_monotonic_t;\n" + "\n" + "typealias integer {\n" + " size = 64; align = %u; signed = false;\n" + " map = clock.monotonic.value;\n" + "} := uint64_clock_monotonic_t;\n\n", + lttng_alignof(uint32_t) * CHAR_BIT, + lttng_alignof(uint64_t) * CHAR_BIT + ); + if (ret) + goto end; + ret = _ltt_stream_packet_context_declare(session); if (ret) goto end; -- 2.34.1