X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Fltt%2Ftracefile.c;h=6500a2d2e229dd88c73dbded7f9ed773a33fa7a2;hb=986e2a7c3f885178f7cf6385af8b325fee83d5f7;hp=c9564bf444e8fa8540c72989a77f1f2f7179dce9;hpb=823820eb1852619c9a24af4a01622356214c01b4;p=lttv.git diff --git a/ltt/branches/poly/ltt/tracefile.c b/ltt/branches/poly/ltt/tracefile.c index c9564bf4..6500a2d2 100644 --- a/ltt/branches/poly/ltt/tracefile.c +++ b/ltt/branches/poly/ltt/tracefile.c @@ -232,15 +232,31 @@ int parse_trace_header(void *header, LttTracefile *tf, LttTrace *t) switch(any->minor_version) { case 3: { - struct ltt_trace_header_0_3 *header_0_3 = - (struct ltt_trace_header_0_3 *)header; tf->buffer_header_size = sizeof(struct ltt_block_start_header) + sizeof(struct ltt_trace_header_0_3); + g_warning("Unsupported trace version : %hhu.%hhu", + any->major_version, any->minor_version); + return 1; + } + break; + case 4: + { + struct ltt_trace_header_0_4 *vheader = + (struct ltt_trace_header_0_4 *)header; + tf->buffer_header_size = + sizeof(struct ltt_block_start_header) + + sizeof(struct ltt_trace_header_0_4); + if(t) { + t->start_monotonic = ltt_get_uint64(LTT_GET_BO(tf), + &vheader->start_monotonic); + t->start_time = ltt_get_time(LTT_GET_BO(tf), + &vheader->start_time); + } } break; default: - g_warning("Unsupported trace version : %hhu.%hhu", + g_warning("Unsupported trace version : %hhu.%hhu", any->major_version, any->minor_version); return 1; } @@ -292,8 +308,8 @@ gint ltt_tracefile_open(LttTrace *t, gchar * fileName, LttTracefile *tf) // Is the file large enough to contain a trace if(lTDFStat.st_size < - (off_t)(sizeof(struct ltt_block_start_header - + sizeof(ltt_trace_header_any)))){ + (off_t)(sizeof(struct ltt_block_start_header) + + sizeof(struct ltt_trace_header_any))){ g_print("The input data file %s does not contain a trace\n", fileName); goto close_file; } @@ -301,8 +317,8 @@ gint ltt_tracefile_open(LttTrace *t, gchar * fileName, LttTracefile *tf) /* Temporarily map the buffer start header to get trace information */ /* Multiple of pages aligned head */ tf->buffer.head = mmap(0, - PAGE_ALIGN(sizeof(struct ltt_block_start_header - + sizeof(struct ltt_trace_header_any))), PROT_READ, + PAGE_ALIGN(sizeof(struct ltt_block_start_header) + + sizeof(struct ltt_trace_header_any)), PROT_READ, MAP_PRIVATE, tf->fd, 0); if(tf->buffer.head == MAP_FAILED) { perror("Error in allocating memory for buffer of tracefile"); @@ -312,7 +328,10 @@ gint ltt_tracefile_open(LttTrace *t, gchar * fileName, LttTracefile *tf) header = (struct ltt_block_start_header*)tf->buffer.head; - if(parse_trace_header(header->trace, tf, NULL)) goto unmap_file; + if(parse_trace_header(header->trace, tf, NULL)) { + g_warning("parse_trace_header error"); + goto unmap_file; + } //store the size of the file tf->file_size = lTDFStat.st_size; @@ -320,11 +339,11 @@ gint ltt_tracefile_open(LttTrace *t, gchar * fileName, LttTracefile *tf) tf->num_blocks = tf->file_size / tf->buf_size; if(munmap(tf->buffer.head, - PAGE_ALIGN(sizeof(struct ltt_block_start_header - + sizeof(struct ltt_trace_header_any))))) { + PAGE_ALIGN(sizeof(struct ltt_block_start_header) + + sizeof(struct ltt_trace_header_any)))) { g_warning("unmap size : %u\n", - PAGE_ALIGN(sizeof(struct ltt_block_start_header - + sizeof(struct ltt_trace_header_any)))); + PAGE_ALIGN(sizeof(struct ltt_block_start_header) + + sizeof(struct ltt_trace_header_any))); perror("munmap error"); g_assert(0); } @@ -341,11 +360,11 @@ gint ltt_tracefile_open(LttTrace *t, gchar * fileName, LttTracefile *tf) /* Error */ unmap_file: if(munmap(tf->buffer.head, - PAGE_ALIGN(sizeof(struct ltt_block_start_header - + sizeof(struct ltt_trace_header_any))))) { + PAGE_ALIGN(sizeof(struct ltt_block_start_header) + + sizeof(struct ltt_trace_header_any)))) { g_warning("unmap size : %u\n", - PAGE_ALIGN(sizeof(struct ltt_block_start_header - + sizeof(struct ltt_trace_header_any)))); + PAGE_ALIGN(sizeof(struct ltt_block_start_header) + + sizeof(struct ltt_trace_header_any))); perror("munmap error"); g_assert(0); } @@ -803,7 +822,7 @@ static int open_tracefiles(LttTrace *trace, gchar *root_path, /* ltt_get_facility_description * - * Opens the trace corresponding to the requested facility (identified by fac_id + * Opens the file corresponding to the requested facility (identified by fac_id * and checksum). * * The name searched is : %trace root%/eventdefs/facname_checksum.xml @@ -835,7 +854,7 @@ static int ltt_get_facility_description(LttFacility *f, textlen+=strlen(text); if(textlen >= PATH_MAX) goto name_error; strcat(desc_file_name, text); - +#if 0 text = "_"; textlen+=strlen(text); if(textlen >= PATH_MAX) goto name_error; @@ -847,11 +866,12 @@ static int ltt_get_facility_description(LttFacility *f, textlen=strlen(desc_file_name); +#endif //0 text = ".xml"; textlen+=strlen(text); if(textlen >= PATH_MAX) goto name_error; strcat(desc_file_name, text); - + err = ltt_facility_open(f, t, desc_file_name); if(err) goto facility_error; @@ -1114,7 +1134,8 @@ LttTrace *ltt_trace_open(const gchar *pathname) g_assert(group->len > 0); tf = &g_array_index (group, LttTracefile, 0); header = (struct ltt_block_start_header*)tf->buffer.head; - g_assert(parse_trace_header(header->trace, tf, t) == 0); + g_assert(parse_trace_header(header->trace, + tf, t) == 0); t->num_cpu = group->len; @@ -1315,11 +1336,17 @@ void ltt_trace_time_span_get(LttTrace *t, LttTime *start, LttTime *end) *Get the name of a tracefile ****************************************************************************/ -GQuark ltt_tracefile_name(LttTracefile *tf) +GQuark ltt_tracefile_name(const LttTracefile *tf) { return tf->name; } +GQuark ltt_tracefile_long_name(const LttTracefile *tf) +{ + return tf->long_name; +} + + guint ltt_tracefile_num(LttTracefile *tf) { @@ -1423,16 +1450,16 @@ int ltt_tracefile_seek_time(LttTracefile *tf, LttTime time) if(ret == ERANGE) goto range; /* ERANGE or EPERM */ else if(ret) goto fail; - if(ltt_time_compare(time, tf->event.event_time) >= 0) + if(ltt_time_compare(time, tf->event.event_time) <= 0) goto found; } } else if(ltt_time_compare(time, tf->buffer.begin.timestamp) < 0) { /* go to lower part */ - high = block_num; + high = block_num - 1; } else if(ltt_time_compare(time, tf->buffer.end.timestamp) > 0) { /* go to higher part */ - low = block_num; + low = block_num + 1; } else {/* The event is right in the buffer! (or in the next buffer first event) */ while(1) { @@ -1440,7 +1467,7 @@ int ltt_tracefile_seek_time(LttTracefile *tf, LttTime time) if(ret == ERANGE) goto range; /* ERANGE or EPERM */ else if(ret) goto fail; - if(ltt_time_compare(time, tf->event.event_time) >= 0) + if(ltt_time_compare(time, tf->event.event_time) <= 0) break; } goto found; @@ -1714,25 +1741,37 @@ static gint map_block(LttTracefile * tf, guint block_num) header = (struct ltt_block_start_header*)tf->buffer.head; - tf->buffer.begin.timestamp = ltt_get_time(LTT_GET_BO(tf), - &header->begin.timestamp); - tf->buffer.begin.timestamp.tv_nsec *= NSEC_PER_USEC; - g_debug("block %u begin : %lu.%lu", block_num, - tf->buffer.begin.timestamp.tv_sec, tf->buffer.begin.timestamp.tv_nsec); + tf->buffer.begin.timestamp = ltt_time_add( + ltt_time_from_uint64( + ltt_get_uint64(LTT_GET_BO(tf), + &header->begin.timestamp) + - tf->trace->start_monotonic), + tf->trace->start_time); + //g_debug("block %u begin : %lu.%lu", block_num, + // tf->buffer.begin.timestamp.tv_sec, tf->buffer.begin.timestamp.tv_nsec); tf->buffer.begin.cycle_count = ltt_get_uint64(LTT_GET_BO(tf), &header->begin.cycle_count); - tf->buffer.end.timestamp = ltt_get_time(LTT_GET_BO(tf), - &header->end.timestamp); - tf->buffer.end.timestamp.tv_nsec *= NSEC_PER_USEC; - g_debug("block %u end : %lu.%lu", block_num, - tf->buffer.end.timestamp.tv_sec, tf->buffer.end.timestamp.tv_nsec); + tf->buffer.begin.freq = ltt_get_uint64(LTT_GET_BO(tf), + &header->begin.freq); + tf->buffer.end.timestamp = ltt_time_add( + ltt_time_from_uint64( + ltt_get_uint64(LTT_GET_BO(tf), + &header->end.timestamp) + - tf->trace->start_monotonic), + tf->trace->start_time); + + //g_debug("block %u end : %lu.%lu", block_num, + // tf->buffer.end.timestamp.tv_sec, tf->buffer.end.timestamp.tv_nsec); tf->buffer.end.cycle_count = ltt_get_uint64(LTT_GET_BO(tf), &header->end.cycle_count); + tf->buffer.end.freq = ltt_get_uint64(LTT_GET_BO(tf), + &header->end.freq); tf->buffer.lost_size = ltt_get_uint32(LTT_GET_BO(tf), - &header->lost_size); + &header->lost_size); tf->buffer.tsc = tf->buffer.begin.cycle_count; tf->event.tsc = tf->buffer.tsc; + tf->buffer.freq = tf->buffer.begin.freq; /* FIXME * eventually support variable buffer size : will need a partial pre-read of @@ -1772,21 +1811,21 @@ void ltt_update_event_size(LttTracefile *tf) switch((enum ltt_core_events)tf->event.event_id) { case LTT_EVENT_FACILITY_LOAD: size = strlen((char*)tf->event.data) + 1; - g_debug("Update Event facility load of facility %s", (char*)tf->event.data); + //g_debug("Update Event facility load of facility %s", (char*)tf->event.data); size += sizeof(struct LttFacilityLoad); break; case LTT_EVENT_FACILITY_UNLOAD: - g_debug("Update Event facility unload"); + //g_debug("Update Event facility unload"); size = sizeof(struct LttFacilityUnload); break; case LTT_EVENT_STATE_DUMP_FACILITY_LOAD: size = strlen((char*)tf->event.data) + 1; - g_debug("Update Event facility load state dump of facility %s", - (char*)tf->event.data); + //g_debug("Update Event facility load state dump of facility %s", + // (char*)tf->event.data); size += sizeof(struct LttStateDumpFacilityLoad); break; case LTT_EVENT_HEARTBEAT: - g_debug("Update Event heartbeat"); + //g_debug("Update Event heartbeat"); size = sizeof(TimeHeartbeat); break; default: @@ -1823,9 +1862,9 @@ void ltt_update_event_size(LttTracefile *tf) else size = 0; - g_debug("Event root field : f.e %hhu.%hhu size %zd", - tf->event.facility_id, - tf->event.event_id, size); + //g_debug("Event root field : f.e %hhu.%hhu size %zd", + // tf->event.facility_id, + // tf->event.event_id, size); } tf->event.data_size = size; @@ -1860,8 +1899,7 @@ static int ltt_seek_next_event(LttTracefile *tf) /* seek over the buffer header if we are at the buffer start */ if(tf->event.offset == 0) { - tf->event.offset += sizeof(struct ltt_block_start_header - + tf->buffer_header_size); + tf->event.offset += tf->buffer_header_size; if(tf->event.offset == tf->buf_size - tf->buffer.lost_size) { ret = ERANGE; @@ -1882,6 +1920,7 @@ static int ltt_seek_next_event(LttTracefile *tf) ret = ERANGE; goto found; } + g_assert(tf->event.offset < tf->buf_size - tf->buffer.lost_size); found: return ret; @@ -1896,29 +1935,21 @@ error: /***************************************************************************** *Function name * calc_nsecs_per_cycle : calculate nsecs per cycle for current block + * + * 1.0 / (freq(khz) *1000) * 1000000000 *Input Params * t : tracefile ****************************************************************************/ - +/* from timer_tsc.c */ +#define CYC2NS_SCALE_FACTOR 10 static double calc_nsecs_per_cycle(LttTracefile * tf) { - LttTime lBufTotalTime; /* Total time for this buffer */ - double lBufTotalNSec; /* Total time for this buffer in nsecs */ - LttCycleCount lBufTotalCycle;/* Total cycles for this buffer */ - - /* Calculate the total time for this buffer */ - lBufTotalTime = ltt_time_sub(tf->buffer.end.timestamp, - tf->buffer.begin.timestamp); - - /* Calculate the total cycles for this bufffer */ - lBufTotalCycle = tf->buffer.end.cycle_count; - lBufTotalCycle -= tf->buffer.begin.cycle_count; - - /* Convert the total time to double */ - lBufTotalNSec = ltt_time_to_double(lBufTotalTime); + //return 1e6 / (double)tf->buffer.freq; + guint64 cpu_mhz = tf->buffer.freq / 1000; + guint64 cyc2ns_scale = (1000 << CYC2NS_SCALE_FACTOR)/cpu_mhz; - return lBufTotalNSec / (double)lBufTotalCycle; - + return cyc2ns_scale >> CYC2NS_SCALE_FACTOR; + // return 1e6 / (double)tf->buffer.freq; } #if 0 void setFieldsOffset(LttTracefile *tf, LttEventType *evT,void *evD)