X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Fltt%2Ftracefile.c;h=b026d4e2a35dbdb9f90fd1f56517d47c458e1d1d;hb=f2a74ed3fec31023600e9f24b318d9b9cc2c9a12;hp=df02f4be3b2860c1706d068af955b37dc63a5601;hpb=29af7cfdc9979121f09db4ba7c154f52d0fb518e;p=lttv.git diff --git a/ltt/branches/poly/ltt/tracefile.c b/ltt/branches/poly/ltt/tracefile.c index df02f4be..b026d4e2 100644 --- a/ltt/branches/poly/ltt/tracefile.c +++ b/ltt/branches/poly/ltt/tracefile.c @@ -48,7 +48,7 @@ #include //#include #include -#include +#include /* Facility names used in this file */ @@ -231,7 +231,7 @@ int parse_trace_header(void *header, LttTracefile *tf, LttTrace *t) /* Get float byte order : might be different from int byte order * (or is set to 0 if the trace has no float (kernel trace)) */ tf->float_word_order = any->float_word_order; - tf->has_alignment = any->has_alignment; + tf->alignment = any->alignment; tf->has_heartbeat = any->has_heartbeat; if(t) { @@ -246,6 +246,8 @@ int parse_trace_header(void *header, LttTracefile *tf, LttTrace *t) // t->compact_facilities = NULL; } + printf("init size : %d\n", sizeof(LttTracefile)); + switch(any->major_version) { @@ -1090,7 +1092,7 @@ int ltt_process_facility_tracefile(LttTracefile *tf) goto event_id_error; } else { - void *pos; + char *pos; const char *marker_name, *format; uint16_t id; guint8 int_size, long_size, pointer_size, size_t_size, alignment; @@ -1098,11 +1100,12 @@ int ltt_process_facility_tracefile(LttTracefile *tf) // FIXME align switch((enum marker_id)tf->event.event_id) { case MARKER_ID_SET_MARKER_ID: - marker_name = (char*)(tf->event.data); + marker_name = pos = tf->event.data; g_debug("Doing MARKER_ID_SET_MARKER_ID of marker %s", marker_name); - pos = (tf->event.data + strlen(marker_name) + 1); - pos += ltt_align((size_t)pos, tf->trace->arch_size, tf->has_alignment); - pos += ltt_align((size_t)pos, sizeof(uint16_t), tf->has_alignment); + pos += strlen(marker_name) + 1; + //remove genevent compatibility + //pos += ltt_align((size_t)pos, tf->trace->arch_size, tf->alignment); + pos += ltt_align((size_t)pos, sizeof(uint16_t), tf->alignment); id = ltt_get_uint16(LTT_GET_BO(tf), pos); pos += sizeof(guint16); int_size = *(guint8*)pos; @@ -1120,14 +1123,16 @@ int ltt_process_facility_tracefile(LttTracefile *tf) pointer_size, size_t_size, alignment); break; case MARKER_ID_SET_MARKER_FORMAT: - marker_name = (char*)(tf->event.data); + marker_name = pos = tf->event.data; g_debug("Doing MARKER_ID_SET_MARKER_FORMAT of marker %s", marker_name); - pos = (tf->event.data + strlen(marker_name) + 1); - pos += ltt_align((size_t)pos, tf->trace->arch_size, tf->has_alignment); - format = (const char*)pos; + pos += strlen(marker_name) + 1; + //break genevent. + //pos += ltt_align((size_t)pos, tf->trace->arch_size, tf->alignment); + format = pos; pos += strlen(format) + 1; - pos += ltt_align((size_t)pos, tf->trace->arch_size, tf->has_alignment); + //break genevent + //pos += ltt_align((size_t)pos, tf->trace->arch_size, tf->alignment); marker_format_event(tf->trace, g_quark_from_string(marker_name), format); /* get information from dictionnary TODO */ @@ -1230,6 +1235,10 @@ LttTrace *ltt_trace_open(const gchar *pathname) t->num_cpu = group->len; + ret = allocate_marker_data(t); + if (ret) + g_error("Error in allocating marker data"); + for(i=0; ilen; i++) { tf = &g_array_index (group, LttTracefile, i); if(ltt_process_facility_tracefile(tf)) @@ -1240,8 +1249,7 @@ LttTrace *ltt_trace_open(const gchar *pathname) /* Error handling */ facilities_error: - g_datalist_clear(&t->facilities_by_name); - g_array_free(t->facilities_by_num, TRUE); + destroy_marker_data(t); find_error: g_datalist_clear(&t->tracefiles); open_error: @@ -1748,10 +1756,10 @@ int ltt_tracefile_read_update_event(LttTracefile *tf) /* Align the head */ if(!tf->compact) - pos += ltt_align((size_t)pos, tf->trace->arch_size, tf->has_alignment); + pos += ltt_align((size_t)pos, tf->trace->arch_size, tf->alignment); else { g_assert(tf->has_heartbeat); - pos += ltt_align((size_t)pos, sizeof(uint32_t), tf->has_alignment); + pos += ltt_align((size_t)pos, sizeof(uint32_t), tf->alignment); } if(tf->has_heartbeat) { @@ -1830,7 +1838,7 @@ int ltt_tracefile_read_update_event(LttTracefile *tf) } /* Align the head */ if(!tf->compact) - pos += ltt_align((size_t)pos, tf->trace->arch_size, tf->has_alignment); + pos += ltt_align((size_t)pos, tf->trace->arch_size, tf->alignment); event->data = pos; @@ -1986,7 +1994,7 @@ void ltt_update_event_size(LttTracefile *tf) case MARKER_ID_SET_MARKER_ID: size = strlen((char*)tf->event.data) + 1; //g_debug("marker %s id set", (char*)tf->event.data); - size += ltt_align(size, sizeof(guint16), tf->has_alignment); + size += ltt_align(size, sizeof(guint16), tf->alignment); size += sizeof(guint16); size += sizeof(guint8); size += sizeof(guint8); @@ -1997,12 +2005,10 @@ void ltt_update_event_size(LttTracefile *tf) case MARKER_ID_SET_MARKER_FORMAT: //g_debug("marker %s format set", (char*)tf->event.data); size = strlen((char*)tf->event.data) + 1; - size += strlen((char*)tf->event.data) + 1; + size += strlen((char*)tf->event.data + size) + 1; break; case MARKER_ID_HEARTBEAT_32: //g_debug("Update Event heartbeat 32 bits"); - size = ltt_align(size, sizeof(guint32), tf->has_alignment); - size += sizeof(guint32); break; case MARKER_ID_HEARTBEAT_64: //g_debug("Update Event heartbeat 64 bits"); @@ -2010,18 +2016,24 @@ void ltt_update_event_size(LttTracefile *tf) tf->event.tsc = ltt_get_uint64(LTT_GET_BO(tf), tscdata); tf->buffer.tsc = tf->event.tsc; tf->event.event_time = ltt_interpolate_time(tf, &tf->event); - size = ltt_align(size, sizeof(guint64), tf->has_alignment); + size = ltt_align(size, sizeof(guint64), tf->alignment); size += sizeof(guint64); break; - default: - info = marker_get_info_from_id(tf->trace, tf->event.event_id); - g_assert(info != NULL); - if (info->size != -1) { - size = info->size; - } else { - size = marker_update_fields_offsets(marker_get_info_from_id(tf->trace, - tf->event.event_id), tf->event.data); - } + } + + info = marker_get_info_from_id(tf->trace, tf->event.event_id); + if (tf->event.event_id >= MARKER_CORE_IDS) + g_assert(info != NULL); + + /* Do not update field offsets of core markers when initially reading the + * facility tracefile when the infos about these markers do not exist yet. + */ + if (likely(info && info->fields)) { + if (info->size != -1) + size = info->size; + else + size = marker_update_fields_offsets(marker_get_info_from_id(tf->trace, + tf->event.event_id), tf->event.data); } tf->event.data_size = size;