X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Fltt%2Fevent.c;h=438c3597f2bbdedf18a495539b2ff362489c3aff;hb=63c35f6c3a742bb0bcd558c4899221231bcb05d7;hp=e4cdfc77a28577322dca9f91bfa93863b2110380;hpb=8d1e6362a5e8b3086942948c0d5c79c0433dadcd;p=lttv.git diff --git a/ltt/branches/poly/ltt/event.c b/ltt/branches/poly/ltt/event.c index e4cdfc77..438c3597 100644 --- a/ltt/branches/poly/ltt/event.c +++ b/ltt/branches/poly/ltt/event.c @@ -59,6 +59,62 @@ int ltt_event_refresh_fields(int offsetRoot,int offsetParent, int size, size1, element_number, i, offset1, offset2; LttType * type = fld->field_type; + switch(type->type_class) { + case LTT_ARRAY: + element_number = (int) type->element_number; + if(fld->field_fixed == 0){// has string or sequence + size = 0; + for(i=0;ichild[0], evD+size); + } + }else size = fld->field_size; + break; + + case LTT_SEQUENCE: + size1 = fld->sequ_number_size; + element_number = getIntNumber(size1,evD); + type->element_number = element_number; + if(fld->element_size > 0){ + size = element_number * fld->element_size; + }else{//sequence has string or sequence + size = 0; + for(i=0;ichild[0], evD+size+size1); + } + size += size1; + } + break; + + case LTT_STRING: + size = strlen((char*)evD) + 1; //include end : '\0' + break; + + case LTT_STRUCT: + element_number = (int) type->element_number; + if(fld->field_fixed == 0){ + offset1 = offsetRoot; + offset2 = 0; + for(i=0;ichild[i],evD+offset2); + offset1 += size; + offset2 += size; + } + size = offset2; + }else size = fld->field_size; + break; + + case LTT_UNION: + size = fld->field_size; + break; + + default: + size = fld->field_size; + } + +#if 0 if(type->type_class != LTT_STRUCT && type->type_class != LTT_ARRAY && type->type_class != LTT_SEQUENCE && type->type_class != LTT_STRING){ size = fld->field_size; @@ -67,9 +123,9 @@ int ltt_event_refresh_fields(int offsetRoot,int offsetParent, if(fld->field_fixed == 0){// has string or sequence size = 0; for(i=0;ichild[0], evD+size); - } + } }else size = fld->field_size; }else if(type->type_class == LTT_SEQUENCE){ size1 = fld->sequ_number_size; @@ -80,8 +136,8 @@ int ltt_event_refresh_fields(int offsetRoot,int offsetParent, }else{//sequence has string or sequence size = 0; for(i=0;ichild[0], evD+size+size1); + size += ltt_event_refresh_fields(offsetRoot+size+size1,size+size1, + fld->child[0], evD+size+size1); } size += size1; } @@ -93,14 +149,15 @@ int ltt_event_refresh_fields(int offsetRoot,int offsetParent, offset1 = offsetRoot; offset2 = 0; for(i=0;ichild[i],evD+offset2); - offset1 += size; - offset2 += size; + size=ltt_event_refresh_fields(offset1,offset2, + fld->child[i],evD+offset2); + offset1 += size; + offset2 += size; } size = offset2; }else size = fld->field_size; } - +#endif //0 fld->offset_root = offsetRoot; fld->offset_parent = offsetParent; fld->fixed_root = (offsetRoot==-1) ? 0 : 1; @@ -170,21 +227,19 @@ LttField *ltt_event_field(LttEvent *e) { LttField * field; LttEventType * event_type = ltt_event_eventtype(e); - if(!event_type) return NULL; + if(unlikely(!event_type)) return NULL; field = event_type->root_field; - if(!field) return NULL; + if(unlikely(!field)) return NULL; //check if the field need refresh - if(e->which_block != event_type->latest_block || - e->which_event != event_type->latest_event){ + if(likely(e->which_block != event_type->latest_block || + e->which_event != event_type->latest_event)){ event_type->latest_block = e->which_block; event_type->latest_event = e->which_event; - if(field->field_fixed == 1)return field; - - //refresh the field - ltt_event_refresh_fields(0, 0, field, e->data); + if(unlikely(field->field_fixed != 1)) + ltt_event_refresh_fields(0, 0, field, e->data); } return field; } @@ -235,13 +290,15 @@ void ltt_event_position(LttEvent *e, LttEventPosition *ep) ep->old_position = TRUE; ep->event_offset = e->data - e->tracefile->buffer - EVENT_HEADER_SIZE ; ep->tf = e->tracefile; - + ep->overflow_nsec = e->overflow_nsec; /* This is a workaround for fast position seek */ ep->last_event_pos = e->last_event_pos; ep->prev_block_end_time = e->prev_block_end_time; ep->prev_event_time = e->prev_event_time; ep->pre_cycle_count = e->pre_cycle_count; ep->count = e->count; + ep->last_heartbeat = e->last_heartbeat; + /* end of workaround */ } @@ -491,7 +548,7 @@ void ltt_event_field_element_select(LttEvent *e, LttField *f, unsigned i) * conversions ****************************************************************************/ -unsigned ltt_event_get_unsigned(LttEvent *e, LttField *f) +guint32 ltt_event_get_unsigned(LttEvent *e, LttField *f) { int revFlag = e->tracefile->trace->my_arch_endian == e->tracefile->trace->system_description->endian ? 0:1; @@ -501,31 +558,34 @@ unsigned ltt_event_get_unsigned(LttEvent *e, LttField *f) if(f->field_size == 1){ guint8 x = *(guint8 *)(e->data + f->offset_root); - return (unsigned int) x; + return (guint32) x; }else if(f->field_size == 2){ guint16 x = *(guint16 *)(e->data + f->offset_root); if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN) - return (unsigned int) (revFlag ? GUINT16_FROM_BE(x): x); + return (guint32) (revFlag ? GUINT16_FROM_BE(x): x); else - return (unsigned int) (revFlag ? GUINT16_FROM_LE(x): x); + return (guint32) (revFlag ? GUINT16_FROM_LE(x): x); }else if(f->field_size == 4){ guint32 x = *(guint32 *)(e->data + f->offset_root); if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN) - return (unsigned int) (revFlag ? GUINT32_FROM_BE(x): x); + return (guint32) (revFlag ? GUINT32_FROM_BE(x): x); else - return (unsigned int) (revFlag ? GUINT32_FROM_LE(x): x); - }else if(f->field_size == 8){ + return (guint32) (revFlag ? GUINT32_FROM_LE(x): x); + } +#if 0 + else if(f->field_size == 8){ guint64 x = *(guint64 *)(e->data + f->offset_root); if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN) return (unsigned int) (revFlag ? GUINT64_FROM_BE(x): x); else return (unsigned int) (revFlag ? GUINT64_FROM_LE(x): x); } +#endif //0 g_critical("ltt_event_get_unsigned : field size %i unknown", f->field_size); return 0; } -int ltt_event_get_int(LttEvent *e, LttField *f) +gint32 ltt_event_get_int(LttEvent *e, LttField *f) { int revFlag = e->tracefile->trace->my_arch_endian == e->tracefile->trace->system_description->endian ? 0:1; @@ -534,31 +594,34 @@ int ltt_event_get_int(LttEvent *e, LttField *f) if(f->field_size == 1){ gint8 x = *(gint8 *)(e->data + f->offset_root); - return (int) x; + return (gint32) x; }else if(f->field_size == 2){ gint16 x = *(gint16 *)(e->data + f->offset_root); if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN) - return (int) (revFlag ? GINT16_FROM_BE(x): x); + return (gint32) (revFlag ? GINT16_FROM_BE(x): x); else - return (int) (revFlag ? GINT16_FROM_LE(x): x); + return (gint32) (revFlag ? GINT16_FROM_LE(x): x); }else if(f->field_size == 4){ gint32 x = *(gint32 *)(e->data + f->offset_root); if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN) - return (int) (revFlag ? GINT32_FROM_BE(x): x); + return (gint32) (revFlag ? GINT32_FROM_BE(x): x); else - return (int) (revFlag ? GINT32_FROM_LE(x): x); - }else if(f->field_size == 8){ + return (gint32) (revFlag ? GINT32_FROM_LE(x): x); + } +#if 0 + else if(f->field_size == 8){ gint64 x = *(gint64 *)(e->data + f->offset_root); if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN) return (int) (revFlag ? GINT64_FROM_BE(x): x); else return (int) (revFlag ? GINT64_FROM_LE(x): x); } +#endif //0 g_critical("ltt_event_get_int : field size %i unknown", f->field_size); return 0; } -unsigned long ltt_event_get_long_unsigned(LttEvent *e, LttField *f) +guint64 ltt_event_get_long_unsigned(LttEvent *e, LttField *f) { int revFlag = e->tracefile->trace->my_arch_endian == e->tracefile->trace->system_description->endian ? 0:1; @@ -568,31 +631,31 @@ unsigned long ltt_event_get_long_unsigned(LttEvent *e, LttField *f) if(f->field_size == 1){ guint8 x = *(guint8 *)(e->data + f->offset_root); - return (unsigned long) x; + return (guint64) x; }else if(f->field_size == 2){ guint16 x = *(guint16 *)(e->data + f->offset_root); if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN) - return (unsigned long) (revFlag ? GUINT16_FROM_BE(x): x); + return (guint64) (revFlag ? GUINT16_FROM_BE(x): x); else - return (unsigned long) (revFlag ? GUINT16_FROM_LE(x): x); + return (guint64) (revFlag ? GUINT16_FROM_LE(x): x); }else if(f->field_size == 4){ guint32 x = *(guint32 *)(e->data + f->offset_root); if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN) - return (unsigned long) (revFlag ? GUINT32_FROM_BE(x): x); + return (guint64) (revFlag ? GUINT32_FROM_BE(x): x); else - return (unsigned long) (revFlag ? GUINT32_FROM_LE(x): x); + return (guint64) (revFlag ? GUINT32_FROM_LE(x): x); }else if(f->field_size == 8){ guint64 x = *(guint64 *)(e->data + f->offset_root); if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN) - return (unsigned long) (revFlag ? GUINT64_FROM_BE(x): x); + return (guint64) (revFlag ? GUINT64_FROM_BE(x): x); else - return (unsigned long) (revFlag ? GUINT64_FROM_LE(x): x); + return (guint64) (revFlag ? GUINT64_FROM_LE(x): x); } g_critical("ltt_event_get_long_unsigned : field size %i unknown", f->field_size); return 0; } -long int ltt_event_get_long_int(LttEvent *e, LttField *f) +gint64 ltt_event_get_long_int(LttEvent *e, LttField *f) { int revFlag = e->tracefile->trace->my_arch_endian == e->tracefile->trace->system_description->endian ? 0:1; @@ -601,25 +664,25 @@ long int ltt_event_get_long_int(LttEvent *e, LttField *f) if(f->field_size == 1){ gint8 x = *(gint8 *)(e->data + f->offset_root); - return (long) x; + return (gint64) x; }else if(f->field_size == 2){ gint16 x = *(gint16 *)(e->data + f->offset_root); if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN) - return (long) (revFlag ? GINT16_FROM_BE(x): x); + return (gint64) (revFlag ? GINT16_FROM_BE(x): x); else - return (long) (revFlag ? GINT16_FROM_LE(x): x); + return (gint64) (revFlag ? GINT16_FROM_LE(x): x); }else if(f->field_size == 4){ gint32 x = *(gint32 *)(e->data + f->offset_root); if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN) - return (long) (revFlag ? GINT32_FROM_BE(x): x); + return (gint64) (revFlag ? GINT32_FROM_BE(x): x); else - return (long) (revFlag ? GINT32_FROM_LE(x): x); + return (gint64) (revFlag ? GINT32_FROM_LE(x): x); }else if(f->field_size == 8){ gint64 x = *(gint64 *)(e->data + f->offset_root); if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN) - return (long) (revFlag ? GINT64_FROM_BE(x): x); + return (gint64) (revFlag ? GINT64_FROM_BE(x): x); else - return (long) (revFlag ? GINT64_FROM_LE(x): x); + return (gint64) (revFlag ? GINT64_FROM_LE(x): x); } g_critical("ltt_event_get_long_int : field size %i unknown", f->field_size); return 0; @@ -637,7 +700,7 @@ float ltt_event_get_float(LttEvent *e, LttField *f) guint32 aInt; memcpy((void*)&aInt, e->data + f->offset_root, 4); aInt = ___swab32(aInt); - return *((float*)&aInt); + return ((float)aInt); } } @@ -653,7 +716,7 @@ double ltt_event_get_double(LttEvent *e, LttField *f) guint64 aInt; memcpy((void*)&aInt, e->data + f->offset_root, 8); aInt = ___swab64(aInt); - return *((double *)&aInt); + return ((double)aInt); } }