X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Fltt%2Ftracefile.c;h=debf0327eb40bdc235b69963afb317cd26f2752f;hb=202f6c8f25f240e60e41792e631f9be93cce9166;hp=6186fc2ca5e70da0cfb75b8745b5fa3d7b53451e;hpb=1ee6a9affe396783f98e15de3ba27faf96cd1ccd;p=lttv.git diff --git a/ltt/branches/poly/ltt/tracefile.c b/ltt/branches/poly/ltt/tracefile.c index 6186fc2c..debf0327 100644 --- a/ltt/branches/poly/ltt/tracefile.c +++ b/ltt/branches/poly/ltt/tracefile.c @@ -5,9 +5,11 @@ #include #include -#include #include "parser.h" +#include +#include "ltt-private.h" #include +#include #define DIR_NAME_SIZE 256 @@ -108,7 +110,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; @@ -128,7 +130,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); @@ -459,6 +461,12 @@ LttTrace *ltt_trace_open(const char *pathname) return t; } +char * ltt_trace_name(LttTrace *t) +{ + return t->pathname; +} + + /****************************************************************************** * 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. @@ -739,6 +747,77 @@ 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) { @@ -782,22 +861,19 @@ void ltt_tracefile_seek_time(LttTracefile *t, LttTime 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 )){ - 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) ; + 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; @@ -856,14 +932,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; @@ -919,7 +995,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; @@ -938,7 +1014,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; @@ -991,7 +1067,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); @@ -1066,12 +1142,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; @@ -1085,7 +1161,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; @@ -1273,11 +1349,11 @@ int getFieldtypeSize(LttTracefile * t, LttEventType * evT, int offsetRoot, 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; } @@ -1311,3 +1387,34 @@ void getDataEndianType(LttArchSize * size, LttArchEndian * endian) else *size = LTT_UNKNOWN; } +/* get the node name of the system */ + +char * ltt_trace_system_description_node_name (LttSystemDescription * s) +{ + return s->node_name; +} + + +/* get the domain name of the system */ + +char * ltt_trace_system_description_domain_name (LttSystemDescription * s) +{ + return s->domain_name; +} + + +/* get the description of the system */ + +char * ltt_trace_system_description_description (LttSystemDescription * s) +{ + return s->description; +} + + +/* get the start time of the trace */ + +LttTime ltt_trace_system_description_trace_start_time(LttSystemDescription *s) +{ + return s->trace_start; +} +