X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=ltt%2Ftracefile.c;h=c206b0466e06147e53597f48fb608af5280095c9;hb=b580cd560be7071d66914eac1421b762a4e081db;hp=d61f4af879f2425ef243abc63549dbdbd6e5b848;hpb=9355666580b6f4f8fc006e8a89f46833e3cf30ee;p=lttv.git diff --git a/ltt/tracefile.c b/ltt/tracefile.c index d61f4af8..c206b046 100644 --- a/ltt/tracefile.c +++ b/ltt/tracefile.c @@ -80,8 +80,6 @@ GQuark LTT_TRACEFILE_NAME_METADATA; #define PAGE_MASK (~(page_size-1)) #define PAGE_ALIGN(addr) (((addr)+page_size-1)&PAGE_MASK) -LttTrace *father_trace = NULL; - /* set the offset of the fields belonging to the event, need the information of the archecture */ //void set_fields_offsets(LttTracefile *tf, LttEventType *event_type); @@ -150,9 +148,9 @@ static int parse_trace_header(ltt_subbuffer_header_t *header, break; case 2: switch(header->minor_version) { - case 5: + case 6: { - struct ltt_subbuffer_header_2_5 *vheader = header; + struct ltt_subbuffer_header_2_6 *vheader = header; tf->buffer_header_size = ltt_subbuffer_header_size(); tf->tscbits = 27; tf->eventbits = 5; @@ -164,12 +162,6 @@ static int parse_trace_header(ltt_subbuffer_header_t *header, &vheader->start_freq); t->freq_scale = ltt_get_uint32(LTT_GET_BO(tf), &vheader->freq_scale); - if(father_trace) { - t->start_freq = father_trace->start_freq; - t->freq_scale = father_trace->freq_scale; - } else { - father_trace = t; - } t->start_tsc = ltt_get_uint64(LTT_GET_BO(tf), &vheader->cycle_count_begin); t->start_monotonic = 0; @@ -179,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; @@ -880,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) @@ -1162,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 */