X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Fltt%2Ftracefile.c;h=f98c171c585e63e1ea789bd1918a2e5595ff5df4;hb=caf7a67aae62a5b7501b97d35eac91fd0a10972a;hp=1bcc111afde24f76d5eec72eadd1c7df1a01d653;hpb=e37c1372645a505468f33a563a076502f36930c2;p=lttv.git diff --git a/ltt/branches/poly/ltt/tracefile.c b/ltt/branches/poly/ltt/tracefile.c index 1bcc111a..f98c171c 100644 --- a/ltt/branches/poly/ltt/tracefile.c +++ b/ltt/branches/poly/ltt/tracefile.c @@ -5,7 +5,6 @@ #include #include -#include #include "parser.h" #include @@ -33,10 +32,6 @@ void updateTracefile(LttTracefile * tf); /* go to the next event */ int skipEvent(LttTracefile * t); -/* compare two time (LttTime), 0:t1=t2, -1:t1t2 */ -int timecmp(LttTime * t1, LttTime * t2); - - /***************************************************************************** *Function name @@ -112,7 +107,7 @@ void ltt_tracefile_open_control(LttTrace *t, char * control_name) LttTracefile * tf; LttEvent * ev; LttFacility * f; - uint16_t evId; + guint16 evId; void * pos; FacilityLoad fLoad; int i; @@ -132,7 +127,7 @@ void ltt_tracefile_open_control(LttTrace *t, char * control_name) pos = ev->data; fLoad.name = (char*)pos; fLoad.checksum = *(LttChecksum*)(pos + strlen(fLoad.name)); - fLoad.base_code = *(uint32_t*)(pos + strlen(fLoad.name) + sizeof(LttChecksum)); + fLoad.base_code = *(guint32 *)(pos + strlen(fLoad.name) + sizeof(LttChecksum)); for(i=0;ifacility_number;i++){ f = (LttFacility*)g_ptr_array_index(t->facilities,i); @@ -404,7 +399,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 +458,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 +576,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; } @@ -683,8 +688,8 @@ void ltt_trace_time_span_get(LttTrace *t, LttTime *start, LttTime *end) j = 1; continue; } - if(timecmp(&startSmall,&startTmp) > 0) startSmall = startTmp; - if(timecmp(&endBig,&endTmp) < 0) endBig = endTmp; + if(ltt_time_compare(startSmall,startTmp) > 0) startSmall = startTmp; + if(ltt_time_compare(endBig,endTmp) < 0) endBig = endTmp; } for(i=0;iper_cpu_tracefile_number;i++){ @@ -698,8 +703,8 @@ void ltt_trace_time_span_get(LttTrace *t, LttTime *start, LttTime *end) endBig = endTmp; continue; } - if(timecmp(&startSmall,&startTmp) > 0) startSmall = startTmp; - if(timecmp(&endBig,&endTmp) < 0) endBig = endTmp; + if(ltt_time_compare(startSmall,startTmp) > 0) startSmall = startTmp; + if(ltt_time_compare(endBig,endTmp) < 0) endBig = endTmp; } *start = startSmall; @@ -733,21 +738,92 @@ unsigned ltt_tracefile_block_number(LttTracefile *tf) * t : tracefile * time : criteria of the time ****************************************************************************/ +void ltt_tracefile_find_time_block(LttTracefile *t, LttTime time, + int start_block, int end_block) +{ + int err, tmp_block, s, e; + int headTime; + int tailTime; + + err=readBlock(t,start_block); + if(err) g_error("Can not read tracefile: %s\n", t->name); + if(start_block == end_block)return; + + tailTime = ltt_time_compare(t->a_block_end->time, time); + if(tailTime >= 0) return; + + err=readBlock(t,end_block); + if(err) g_error("Can not read tracefile: %s\n", t->name); + if(start_block+1 == end_block)return; + + headTime = ltt_time_compare(t->a_block_start->time, time); + if(headTime <= 0 ) return; + + tmp_block = (end_block + start_block)/2; + err=readBlock(t,tmp_block); + if(err) g_error("Can not read tracefile: %s\n", t->name); + + headTime = ltt_time_compare(t->a_block_start->time, time); + tailTime = ltt_time_compare(t->a_block_end->time, time); + if(headTime <= 0 && tailTime >= 0) return; + + if(headTime > 0){ + s = start_block + 1; + e = tmp_block - 1; + if(s <= e) + ltt_tracefile_find_time_block(t, time, s, e); + else return; + } + + if(tailTime < 0){ + s = tmp_block + 1; + e = end_block - 1; + if(s <= e) + ltt_tracefile_find_time_block(t, time, s, e); + else return; + } +} + +void ltt_tracefile_backward_find_time_block(LttTracefile *t, LttTime time) +{ + int t_time, h_time, err; + err=readBlock(t,t->which_block-1); + if(err) g_error("Can not read tracefile: %s\n", t->name); + h_time = ltt_time_compare(t->a_block_start->time, time); + t_time = ltt_time_compare(t->a_block_end->time, time); + if(h_time == 0){ + int tmp; + if(t->which_block == 1) return; + err=readBlock(t,t->which_block-1); + if(err) g_error("Can not read tracefile: %s\n", t->name); + tmp = ltt_time_compare(t->a_block_end->time, time); + if(tmp == 0) return ltt_tracefile_seek_time(t, time); + err=readBlock(t,t->which_block+1); + if(err) g_error("Can not read tracefile: %s\n", t->name); + }else if(h_time > 0){ + ltt_tracefile_find_time_block(t, time, 1, t->which_block); + return ltt_tracefile_seek_time(t, time) ; + }else{ + if(t_time >= 0) return ltt_tracefile_seek_time(t, time); + err=readBlock(t,t->which_block+1); + if(err) g_error("Can not read tracefile: %s\n", t->name); + } +} void ltt_tracefile_seek_time(LttTracefile *t, LttTime time) { int err; LttTime lttTime; - int headTime = timecmp(&(t->a_block_start->time), &time); - int tailTime = timecmp(&(t->a_block_end->time), &time); + int headTime = ltt_time_compare(t->a_block_start->time, time); + int tailTime = ltt_time_compare(t->a_block_end->time, time); LttEvent * ev; if(headTime < 0 && tailTime > 0){ - if(timecmp(&(t->a_block_end->time),&(t->current_event_time)) !=0){ + if(ltt_time_compare(t->a_block_end->time, t->current_event_time) !=0) { lttTime = getEventTime(t); - err = timecmp(<tTime, &time); + err = ltt_time_compare(lttTime, time); if(err > 0){ - if(t->which_event==2 || timecmp(&t->prev_event_time,&time)<0){ + if(t->which_event==2 || (&t->prev_event_time,&time)<0){ return; }else{ updateTracefile(t); @@ -761,7 +837,7 @@ void ltt_tracefile_seek_time(LttTracefile *t, LttTime time) return; } lttTime = getEventTime(t); - err = timecmp(<tTime, &time); + err = ltt_time_compare(lttTime, time); if(err >= 0)return; } }else return; @@ -773,23 +849,22 @@ void ltt_tracefile_seek_time(LttTracefile *t, LttTime time) if(t->which_block == 1){ updateTracefile(t); }else{ - if(timecmp(&(t->prev_block_end_time),&time) >= 0 ){ - err=readBlock(t,t->which_block-1); - if(err) g_error("Can not read tracefile: %s\n", t->name); - return ltt_tracefile_seek_time(t, time) ; + if(ltt_time_compare(t->prev_block_end_time, time) >= 0 || + (t->prev_block_end_time.tv_sec == 0 && + t->prev_block_end_time.tv_nsec == 0 )){ + ltt_tracefile_backward_find_time_block(t, time); }else{ updateTracefile(t); } } }else if(tailTime < 0){ if(t->which_block != t->block_number){ - err=readBlock(t,t->which_block+1); - if(err) g_error("Can not read tracefile: %s\n", t->name); + ltt_tracefile_find_time_block(t, time, t->which_block+1, t->block_number); + return ltt_tracefile_seek_time(t, time); }else { g_print("End of file\n"); return; } - if(tailTime < 0) return ltt_tracefile_seek_time(t, time); }else if(tailTime == 0){ t->cur_event_pos = t->last_event_pos; t->current_event_time = time; @@ -848,14 +923,14 @@ LttEvent *ltt_tracefile_read(LttTracefile *t) if(err)g_error("Can not read tracefile"); } - lttEvent->event_id = (int)(*(uint16_t *)(t->cur_event_pos)); + lttEvent->event_id = (int)(*(guint16 *)(t->cur_event_pos)); if(lttEvent->event_id == TRACE_TIME_HEARTBEAT) t->cur_heart_beat_number++; t->prev_event_time = t->current_event_time; // t->current_event_time = getEventTime(t); - lttEvent->time_delta = *(uint32_t*)(t->cur_event_pos + EVENT_ID_SIZE); + lttEvent->time_delta = *(guint32 *)(t->cur_event_pos + EVENT_ID_SIZE); lttEvent->event_time = t->current_event_time; lttEvent->tracefile = t; @@ -911,7 +986,7 @@ int readFile(int fd, void * buf, size_t size, char * mesg) int readBlock(LttTracefile * tf, int whichBlock) { off_t nbBytes; - uint32_t lostSize; + guint32 lostSize; if(whichBlock - tf->which_block == 1 && tf->which_block != 0){ tf->prev_block_end_time = tf->a_block_end->time; @@ -930,7 +1005,7 @@ int readBlock(LttTracefile * tf, int whichBlock) return EIO; tf->a_block_start=(BlockStart *) (tf->buffer + EVENT_HEADER_SIZE); - lostSize = *(uint32_t*)(tf->buffer + tf->block_size - sizeof(uint32_t)); + lostSize = *(guint32 *)(tf->buffer + tf->block_size - sizeof(guint32)); tf->a_block_end=(BlockEnd *)(tf->buffer + tf->block_size - lostSize + EVENT_HEADER_SIZE); tf->last_event_pos = tf->buffer + tf->block_size - lostSize; @@ -983,7 +1058,7 @@ int skipEvent(LttTracefile * t) LttEventType * evT; LttField * rootFld; - evId = (int)(*(uint16_t *)(t->cur_event_pos)); + evId = (int)(*(guint16 *)(t->cur_event_pos)); evData = t->cur_event_pos + EVENT_HEADER_SIZE; evT = ltt_trace_eventtype_get(t->trace,(unsigned)evId); @@ -1028,7 +1103,7 @@ void getCyclePerNsec(LttTracefile * t) LttCycleCount lBufTotalCycle;/* Total cycles for this buffer */ /* Calculate the total time for this buffer */ - TimeSub(lBufTotalTime,t->a_block_end->time, t->a_block_start->time); + lBufTotalTime = ltt_time_sub(t->a_block_end->time, t->a_block_start->time); /* Calculate the total cycles for this bufffer */ lBufTotalCycle = t->a_block_end->cycle_count; @@ -1036,7 +1111,7 @@ void getCyclePerNsec(LttTracefile * t) /* Convert the total time to nsecs */ lBufTotalNSec = lBufTotalTime.tv_sec; - lBufTotalNSec *= NANSECOND_CONST; + lBufTotalNSec *= NANOSECONDS_PER_SECOND; lBufTotalNSec += lBufTotalTime.tv_nsec; t->cycle_per_nsec = (double)lBufTotalCycle / (double)lBufTotalNSec; @@ -1058,12 +1133,12 @@ LttTime getEventTime(LttTracefile * tf) LttCycleCount lEventTotalCycle; // Total cycles from start for event double lEventNSec; // Total usecs from start for event LttTime lTimeOffset; // Time offset in struct LttTime - uint16_t evId; - int64_t nanoSec, tmpCycleCount = (((uint64_t)1)<<32); + guint16 evId; + gint64 nanoSec, tmpCycleCount = (((guint64)1)<<32); static LttCycleCount preCycleCount = 0; static int count = 0; - evId = *(uint16_t*)tf->cur_event_pos; + evId = *(guint16 *)tf->cur_event_pos; if(evId == TRACE_BLOCK_START){ count = 0; preCycleCount = 0; @@ -1077,7 +1152,7 @@ LttTime getEventTime(LttTracefile * tf) } // Calculate total time in cycles from start of buffer for this event - cycle_count = (LttCycleCount)*(uint32_t*)(tf->cur_event_pos + EVENT_ID_SIZE); + cycle_count = (LttCycleCount)*(guint32 *)(tf->cur_event_pos + EVENT_ID_SIZE); if(cycle_count < preCycleCount)count++; preCycleCount = cycle_count; @@ -1096,10 +1171,10 @@ LttTime getEventTime(LttTracefile * tf) nanoSec = lEventNSec; // Determine offset in struct LttTime - lTimeOffset.tv_nsec = nanoSec % NANSECOND_CONST; - lTimeOffset.tv_sec = nanoSec / NANSECOND_CONST; + lTimeOffset.tv_nsec = nanoSec % NANOSECONDS_PER_SECOND; + lTimeOffset.tv_sec = nanoSec / NANOSECONDS_PER_SECOND; - TimeAdd(time, tf->a_block_start->time, lTimeOffset); + time = ltt_time_add(tf->a_block_start->time, lTimeOffset); return time; } @@ -1252,24 +1327,6 @@ int getFieldtypeSize(LttTracefile * t, LttEventType * evT, int offsetRoot, return size; } -/***************************************************************************** - *Function name - * timecmp : compare two time - *Input params - * t1 : first time - * t2 : second time - *Return value - * int : 0: t1 == t2; -1: t1 < t2; 1: t1 > t2 - ****************************************************************************/ - -int timecmp(LttTime * t1, LttTime * t2) -{ - 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; -} /***************************************************************************** *Function name @@ -1283,11 +1340,11 @@ int timecmp(LttTime * t1, LttTime * t2) int getIntNumber(int size, void *evD) { - int64_t i; - if(size == 1) i = *(int8_t *)evD; - else if(size == 2) i = *(int16_t *)evD; - else if(size == 4) i = *(int32_t *)evD; - else if(size == 8) i = *(int64_t *)evD; + gint64 i; + if(size == 1) i = *(gint8 *)evD; + else if(size == 2) i = *(gint16 *)evD; + else if(size == 4) i = *(gint32 *)evD; + else if(size == 8) i = *(gint64 *)evD; return (int) i; }