From a3ccff4ffbfa87702cf3bc4693f86c2aaac27be2 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Thu, 26 Jan 2012 21:36:06 -0500 Subject: [PATCH] clock: output clock description in metadata Signed-off-by: Mathieu Desnoyers --- lttng-events.c | 77 +++++++++++++++++++++++++++++++++++++++---- wrapper/trace-clock.h | 8 ++--- 2 files changed, 75 insertions(+), 10 deletions(-) diff --git a/lttng-events.c b/lttng-events.c index 0ef87a8c..6dd3ba4e 100644 --- a/lttng-events.c +++ b/lttng-events.c @@ -794,8 +794,8 @@ int _lttng_stream_packet_context_declare(struct lttng_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" @@ -821,11 +821,11 @@ int _lttng_event_header_declare(struct lttng_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" @@ -834,11 +834,11 @@ int _lttng_event_header_declare(struct lttng_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", @@ -847,6 +847,33 @@ int _lttng_event_header_declare(struct lttng_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 }; + unsigned long flags; + + /* Disable interrupts to increase correlation precision. */ + local_irq_save(flags); + monotonic[0] = trace_clock_read64(); + getnstimeofday(&rts); + monotonic[1] = trace_clock_read64(); + local_irq_restore(flags); + + offset = (monotonic[0] + monotonic[1]) >> 1; + realtime = rts.tv_sec * NSEC_PER_SEC; + realtime += rts.tv_nsec; + offset = realtime - offset; + return offset; +} + /* * Output metadata into this session's metadata buffers. */ @@ -910,6 +937,44 @@ int _lttng_session_metadata_statedump(struct lttng_session *session) if (ret) goto end; + ret = lttng_metadata_printf(session, + "clock {\n" + " name = %s;\n" + " uuid = %s;\n" + " description = \"Monotonic Clock\";\n" + " freq = %llu; /* Frequency, in Hz */\n" + " /* clock value offset from Epoch is: offset * (1/freq) */\n" + " offset = %llu;\n" + "};\n\n", + "monotonic", + trace_clock_uuid(), + (unsigned long long) trace_clock_freq(), + (unsigned long long) 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 = _lttng_stream_packet_context_declare(session); if (ret) goto end; diff --git a/wrapper/trace-clock.h b/wrapper/trace-clock.h index d2579725..1140b94b 100644 --- a/wrapper/trace-clock.h +++ b/wrapper/trace-clock.h @@ -44,14 +44,14 @@ static inline u64 trace_clock_read64(void) return (u64) trace_clock_monotonic_wrapper(); } -static inline u64 trace_clock_frequency(void) +static inline u64 trace_clock_freq(void) { - return (u64)NSEC_PER_SEC; + return (u64) NSEC_PER_SEC; } -static inline u32 trace_clock_freq_scale(void) +static inline const char *trace_clock_uuid(void) { - return 1; + return "CLOCK_MONOTONIC"; } static inline int get_trace_clock(void) -- 2.34.1