X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Fltt%2Ftracefile.c;h=43334ed366d727fcb1527ed7ef7b411ed178004e;hb=487ad18102bd5f8a398f3c14ed3a489d3c89a181;hp=4f10f0829e79c54bd52f4484e02bd493ee90f7b1;hpb=5598cfe32deb9fa897180f3b80cf49ffc720edd0;p=lttv.git diff --git a/ltt/branches/poly/ltt/tracefile.c b/ltt/branches/poly/ltt/tracefile.c index 4f10f082..43334ed3 100644 --- a/ltt/branches/poly/ltt/tracefile.c +++ b/ltt/branches/poly/ltt/tracefile.c @@ -149,7 +149,6 @@ void ltt_tracefile_open_control(LttTrace *t, char * control_name) }else if(ev->event_id == TRACE_BLOCK_END){ break; }else g_error("Not valid facilities trace file\n"); - g_free(ev); } } } @@ -662,6 +661,52 @@ LttTracefile *ltt_trace_per_cpu_tracefile_get(LttTrace *t, unsigned i) return (LttTracefile*)g_ptr_array_index(t->per_cpu_tracefiles, i); } +/***************************************************************************** + * Get the start time and end time of the trace + ****************************************************************************/ + +void ltt_trace_time_span_get(LttTrace *t, LttTime *start, LttTime *end) +{ + LttTime startSmall, startTmp, endBig, endTmp; + int i, j=0; + LttTracefile * tf; + + for(i=0;icontrol_tracefile_number;i++){ + tf = g_ptr_array_index(t->control_tracefiles, i); + readBlock(tf,1); + startTmp = tf->a_block_start->time; + readBlock(tf,tf->block_number); + endTmp = tf->a_block_end->time; + if(i==0){ + startSmall = startTmp; + endBig = endTmp; + j = 1; + continue; + } + if(timecmp(&startSmall,&startTmp) > 0) startSmall = startTmp; + if(timecmp(&endBig,&endTmp) < 0) endBig = endTmp; + } + + for(i=0;iper_cpu_tracefile_number;i++){ + tf = g_ptr_array_index(t->per_cpu_tracefiles, i); + readBlock(tf,1); + startTmp = tf->a_block_start->time; + readBlock(tf,tf->block_number); + endTmp = tf->a_block_end->time; + if(j == 0 && i==0){ + startSmall = startTmp; + endBig = endTmp; + continue; + } + if(timecmp(&startSmall,&startTmp) > 0) startSmall = startTmp; + if(timecmp(&endBig,&endTmp) < 0) endBig = endTmp; + } + + *start = startSmall; + *end = endBig; +} + + /***************************************************************************** *Get the name of a tracefile ****************************************************************************/ @@ -671,6 +716,15 @@ char *ltt_tracefile_name(LttTracefile *tf) return tf->name; } +/***************************************************************************** + * Get the number of blocks in the tracefile + ****************************************************************************/ + +unsigned ltt_tracefile_block_number(LttTracefile *tf) +{ + return tf->block_number; +} + /***************************************************************************** *Function name * ltt_tracefile_seek_time: seek to the first event of the trace with time @@ -705,7 +759,6 @@ void ltt_tracefile_seek_time(LttTracefile *t, LttTime time) g_print("End of file\n"); return; } - g_free(ev); lttTime = getEventTime(t); err = timecmp(<tTime, &time); if(err >= 0)return; @@ -744,6 +797,32 @@ void ltt_tracefile_seek_time(LttTracefile *t, LttTime time) } } +/***************************************************************************** + * Seek to the first event with position equal or larger to ep + ****************************************************************************/ + +void ltt_tracefile_seek_position(LttTracefile *t, LttEventPosition *ep) +{ + //if we are at the right place, just return + if(t->which_block == ep->block_num && t->which_event == ep->event_num) + return; + + if(t->which_block == ep->block_num) updateTracefile(t); + else readBlock(t,ep->block_num); + + //event offset is availiable + if(ep->old_position){ + t->cur_heart_beat_number = ep->heart_beat_number; + t->cur_event_pos = t->buffer + ep->event_offset; + return; + } + + //only block number and event index are availiable + while(t->which_event < ep->event_num) ltt_tracefile_read(t); + + return; +} + /***************************************************************************** *Function name * ltt_tracefile_read : read the current event, set the pointer to the next @@ -755,12 +834,11 @@ void ltt_tracefile_seek_time(LttTracefile *t, LttTime time) LttEvent *ltt_tracefile_read(LttTracefile *t) { - LttEvent * lttEvent = (LttEvent *)g_new(LttEvent, 1); + LttEvent * lttEvent = &t->an_event; int err; if(t->cur_event_pos == t->buffer + t->block_size){ if(t->which_block == t->block_number){ - g_free(lttEvent); return NULL; } err = readBlock(t, t->which_block + 1); @@ -1162,11 +1240,11 @@ int getFieldtypeSize(LttTracefile * t, LttEventType * evT, int offsetRoot, int timecmp(LttTime * t1, LttTime * t2) { - LttTime T; - TimeSub(T, *t1, *t2); - if(T.tv_sec == 0 && T.tv_nsec == 0) return 0; - else if(T.tv_sec > 0 || (T.tv_sec==0 && T.tv_nsec > 0)) return 1; - else return -1; + if(t1->tv_sec < t2->tv_sec) return -1; + if(t1->tv_sec > t2->tv_sec) return 1; + if(t1->tv_nsec < t2->tv_nsec) return -1; + if(t1->tv_nsec > t2->tv_nsec) return 1; + return 0; } /*****************************************************************************