X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Fltt%2Ftracefile.c;h=a2f7bbadcc380376751ea64acaa6016ba8bd6afb;hb=f7afe191fd58f0bf4bab9c9514c261535b99d32b;hp=5c45d56623a3b53db1b374610413c02da1b018d2;hpb=e4eced0fb7cd23ba2b16eff08f2185bed49ab5e5;p=lttv.git diff --git a/ltt/branches/poly/ltt/tracefile.c b/ltt/branches/poly/ltt/tracefile.c index 5c45d566..a2f7bbad 100644 --- a/ltt/branches/poly/ltt/tracefile.c +++ b/ltt/branches/poly/ltt/tracefile.c @@ -404,7 +404,7 @@ void getCpuFileInfo(LttTrace *t, char* cpu) *are released as well. ****************************************************************************/ -LttTrace *ltt_trace_open(char *pathname) +LttTrace *ltt_trace_open(const char *pathname) { LttTrace * t; LttSystemDescription * sys_description; @@ -463,6 +463,16 @@ LttTrace *ltt_trace_open(char *pathname) return t; } +/****************************************************************************** + * When we copy a trace, we want all the opening actions to happen again : + * the trace will be reopened and totally independant from the original. + * That's why we call ltt_trace_open. + *****************************************************************************/ +LttTrace *ltt_trace_copy(LttTrace *self) +{ + return ltt_trace_open(self->pathname); +} + void ltt_trace_close(LttTrace *t) { int i; @@ -571,7 +581,7 @@ unsigned ltt_trace_eventtype_number(LttTrace *t) int i; unsigned count = 0; LttFacility * f; - for(i=0;i=t->facility_number;i++){ + for(i=0;ifacility_number;i++){ f = (LttFacility*)g_ptr_array_index(t->facilities, i); count += f->event_number; } @@ -743,28 +753,33 @@ void ltt_tracefile_seek_time(LttTracefile *t, LttTime time) LttEvent * ev; if(headTime < 0 && tailTime > 0){ - lttTime = getEventTime(t); - err = timecmp(<tTime, &time); - if(err > 0){ - if(t->which_event==2 || timecmp(&t->prev_event_time,&time)<0){ - return; - }else{ - updateTracefile(t); - return ltt_tracefile_seek_time(t, time); - } - }else if(err < 0){ - while(1){ - ev = ltt_tracefile_read(t); - if(ev == NULL){ - g_print("End of file\n"); + if(timecmp(&(t->a_block_end->time),&(t->current_event_time)) !=0){ + lttTime = getEventTime(t); + err = timecmp(<tTime, &time); + if(err > 0){ + if(t->which_event==2 || timecmp(&t->prev_event_time,&time)<0){ return; + }else{ + updateTracefile(t); + return ltt_tracefile_seek_time(t, time); } - lttTime = getEventTime(t); - err = timecmp(<tTime, &time); - if(err >= 0)return; - } - }else return; - }else if(headTime > 0){ + }else if(err < 0){ + while(1){ + ev = ltt_tracefile_read(t); + if(ev == NULL){ + g_print("End of file\n"); + return; + } + lttTime = getEventTime(t); + err = timecmp(<tTime, &time); + if(err >= 0)return; + } + }else return; + }else{//we are at the end of the block + updateTracefile(t); + return ltt_tracefile_seek_time(t, time); + } + }else if(headTime >= 0){ if(t->which_block == 1){ updateTracefile(t); }else{ @@ -785,10 +800,8 @@ void ltt_tracefile_seek_time(LttTracefile *t, LttTime time) return; } if(tailTime < 0) return ltt_tracefile_seek_time(t, time); - }else if(headTime == 0){ - updateTracefile(t); }else if(tailTime == 0){ - t->cur_event_pos = t->a_block_end - EVENT_HEADER_SIZE; + t->cur_event_pos = t->last_event_pos; t->current_event_time = time; t->cur_heart_beat_number = 0; t->prev_event_time.tv_sec = 0; @@ -930,6 +943,7 @@ int readBlock(LttTracefile * tf, int whichBlock) lostSize = *(uint32_t*)(tf->buffer + tf->block_size - sizeof(uint32_t)); tf->a_block_end=(BlockEnd *)(tf->buffer + tf->block_size - lostSize + EVENT_HEADER_SIZE); + tf->last_event_pos = tf->buffer + tf->block_size - lostSize; tf->which_block = whichBlock; tf->which_event = 1;