From 9c9bf2d4c123db7e0d53714410d642388c8ae8e9 Mon Sep 17 00:00:00 2001 From: Benjamin Poirier Date: Thu, 9 Jul 2009 15:13:56 -0400 Subject: [PATCH] Add members to LttTrace to support time adjustments Adds a function to convert tsc values to nanoseconds. Adds drift and offset members for linear clock correction. Signed-off-by: Benjamin Poirier --- ltt/trace.h | 4 ++++ ltt/tracefile.c | 37 ++++++++++++++++--------------------- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/ltt/trace.h b/ltt/trace.h index 202def10..7d7d7122 100644 --- a/ltt/trace.h +++ b/ltt/trace.h @@ -41,6 +41,8 @@ struct LttTrace { uint64_t start_freq; uint64_t start_tsc; uint64_t start_monotonic; + double drift; + double offset; LttTime start_time; LttTime start_time_from_tsc; @@ -207,6 +209,8 @@ gint64 ltt_get_int(gboolean reverse_byte_order, gint size, void *data); guint64 ltt_get_uint(gboolean reverse_byte_order, gint size, void *data); +guint64 tsc_to_uint64(guint32 freq_scale, uint64_t start_freq, guint64 tsc); + LttTime ltt_interpolate_time_from_tsc(LttTracefile *tf, guint64 tsc); /* Set to enable event debugging output */ diff --git a/ltt/tracefile.c b/ltt/tracefile.c index 1d6f2a86..2ac0fa58 100644 --- a/ltt/tracefile.c +++ b/ltt/tracefile.c @@ -171,10 +171,9 @@ static int parse_trace_header(ltt_subbuffer_header_t *header, &vheader->start_time_usec); t->start_time.tv_nsec *= 1000; /* microsec to nanosec */ - t->start_time_from_tsc = ltt_time_from_uint64( - (double)t->start_tsc - * 1000000000.0 * tf->trace->freq_scale - / (double)t->start_freq); + t->start_time_from_tsc = + ltt_time_from_uint64(tsc_to_uint64(t->freq_scale, + t->start_freq, t->start_tsc)); } } break; @@ -872,6 +871,8 @@ LttTrace *ltt_trace_open(const gchar *pathname) g_assert(!ret); t->num_cpu = group->len; + t->drift = 1.; + t->offset = 0.; //ret = allocate_marker_data(t); //if (ret) @@ -1154,28 +1155,22 @@ fail: return 1; } +/* + * Convert a value in "TSC scale" to a value in nanoseconds + */ +guint64 tsc_to_uint64(guint32 freq_scale, uint64_t start_freq, guint64 tsc) +{ + return (double) tsc * NANOSECONDS_PER_SECOND * freq_scale / start_freq; +} + /* Given a TSC value, return the LttTime (seconds,nanoseconds) it * corresponds to. */ - LttTime ltt_interpolate_time_from_tsc(LttTracefile *tf, guint64 tsc) { - LttTime time; - - if(tsc > tf->trace->start_tsc) { - time = ltt_time_from_uint64( - (double)(tsc - tf->trace->start_tsc) - * 1000000000.0 * tf->trace->freq_scale - / (double)tf->trace->start_freq); - time = ltt_time_add(tf->trace->start_time_from_tsc, time); - } else { - time = ltt_time_from_uint64( - (double)(tf->trace->start_tsc - tsc) - * 1000000000.0 * tf->trace->freq_scale - / (double)tf->trace->start_freq); - time = ltt_time_sub(tf->trace->start_time_from_tsc, time); - } - return time; + return ltt_time_from_uint64(tsc_to_uint64(tf->trace->freq_scale, + tf->trace->start_freq, tf->trace->drift * tsc + + tf->trace->offset)); } /* Calculate the real event time based on the buffer boundaries */ -- 2.34.1