X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=ltt%2Ftracefile.c;h=c206b0466e06147e53597f48fb608af5280095c9;hb=41e81bedff5b2a5c97e8b3770681954854b03072;hp=cb8cf93982a92dd7ca41fc026b9501d35ad555ae;hpb=f024106895c1709ae029285835320085e4494582;p=lttv.git diff --git a/ltt/tracefile.c b/ltt/tracefile.c index cb8cf939..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; @@ -240,7 +231,7 @@ int ltt_trace_create_block_index(LttTracefile *tf) /* map block header */ header = mmap(0, header_map_size, PROT_READ, - MAP_PRIVATE, tf->fd, 0); + MAP_PRIVATE, tf->fd, (off_t)offset); if(header == MAP_FAILED) { perror("Error in allocating memory for buffer of tracefile"); return -1; @@ -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 */ @@ -1441,6 +1428,9 @@ static gint map_block(LttTracefile * tf, guint block_num) ret = get_block_offset_size(tf, block_num, &offset, &size); g_assert(!ret); + g_debug("Map block %u, offset %llu, size %u\n", block_num, + (unsigned long long)offset, (unsigned int)size); + /* Multiple of pages aligned head */ tf->buffer.head = mmap(0, (size_t)size, PROT_READ, MAP_PRIVATE, tf->fd, (off_t)offset); @@ -1463,13 +1453,13 @@ static gint map_block(LttTracefile * tf, guint block_num) tf->buffer.offset = offset; tf->buffer.size = ltt_get_uint32(LTT_GET_BO(tf), &header->sb_size); - g_assert(size == tf->buffer.size); tf->buffer.data_size = ltt_get_uint32(LTT_GET_BO(tf), &header->data_size); tf->buffer.tsc = tf->buffer.begin.cycle_count; tf->event.tsc = tf->buffer.tsc; tf->buffer.freq = tf->buffer.begin.freq; + g_assert(size == tf->buffer.size); g_assert(tf->buffer.data_size <= tf->buffer.size); if (tf->trace->start_freq)