X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=ltt%2Ftracefile.c;h=2ac0fa5865a15a1ef10acf234045c95c935992ca;hb=fafb0a2998296c564cbc26c2c0fa5142b181b332;hp=cb8cf93982a92dd7ca41fc026b9501d35ad555ae;hpb=f024106895c1709ae029285835320085e4494582;p=lttv.git diff --git a/ltt/tracefile.c b/ltt/tracefile.c index cb8cf939..2ac0fa58 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); @@ -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)