From 256a5b3a59052aabbb4168c052764b5ba552ae99 Mon Sep 17 00:00:00 2001 From: compudj Date: Thu, 11 Oct 2007 16:00:44 +0000 Subject: [PATCH] change has_alignment for alignment git-svn-id: http://ltt.polymtl.ca/svn@2653 04897980-b3bd-0310-b5e0-8ef037075253 --- ltt/branches/poly/ltt/ltt-private.h | 19 +++++++------ ltt/branches/poly/ltt/marker.c | 12 ++++++-- ltt/branches/poly/ltt/tracefile.c | 44 ++++++++++++++++------------- 3 files changed, 44 insertions(+), 31 deletions(-) diff --git a/ltt/branches/poly/ltt/ltt-private.h b/ltt/branches/poly/ltt/ltt-private.h index 5f6d3e11..c255916c 100644 --- a/ltt/branches/poly/ltt/ltt-private.h +++ b/ltt/branches/poly/ltt/ltt-private.h @@ -130,7 +130,7 @@ struct ltt_trace_header_any { uint8_t minor_version; uint8_t flight_recorder; uint8_t has_heartbeat; - uint8_t has_alignment; /* Event header alignment */ + uint8_t alignment; /* Event header alignment */ uint32_t freq_scale; } LTT_PACKED_STRUCT; @@ -144,7 +144,7 @@ struct ltt_trace_header_1_0 { uint8_t minor_version; uint8_t flight_recorder; uint8_t has_heartbeat; - uint8_t has_alignment; /* Event header alignment */ + uint8_t alignment; /* Event header alignment */ uint8_t tsc_lsb_truncate; uint8_t tscbits; uint32_t freq_scale; @@ -286,7 +286,7 @@ struct LttTracefile { guint num_blocks; //number of blocks in the file gboolean reverse_bo; //must we reverse byte order ? gboolean float_word_order; //what is the byte order of floats ? - size_t has_alignment; //alignment of events in the tracefile. + size_t alignment; //alignment of events in the tracefile. // 0 or the architecture size in bytes. guint8 has_heartbeat; @@ -352,20 +352,21 @@ struct LttSystemDescription { //off_t get_alignment(LttField *field); /* Calculate the offset needed to align the type. - * If has_alignment is 0, alignment is disactivated. + * If alignment is 0, alignment is disactivated. * else, the function returns the offset needed to - * align align_drift on the has_alignment value (should be + * align align_drift on the alignment value (should be * the size of the architecture). */ static inline unsigned int ltt_align(size_t align_drift, size_t size_of_type, - size_t has_alignment) + size_t alignment) { - size_t alignment = min(has_alignment, size_of_type); + size_t align_offset = min(alignment, size_of_type); - if(!has_alignment) return 0; + if(!alignment) + return 0; g_assert(size_of_type != 0); - return ((alignment - align_drift) & (alignment-1)); + return ((align_offset - align_drift) & (align_offset-1)); } diff --git a/ltt/branches/poly/ltt/marker.c b/ltt/branches/poly/ltt/marker.c index 07c50f27..3e2ab3d6 100644 --- a/ltt/branches/poly/ltt/marker.c +++ b/ltt/branches/poly/ltt/marker.c @@ -267,11 +267,17 @@ long marker_update_fields_offsets(struct marker_info *info, const char *data) unsigned int i; long offset = 0; - for (i = 0; i < info->fields->len; i++) { + /* Find the last field with a static offset, then update from there. */ + for (i = info->fields->len - 1; i >= 0; i--) { field = &g_array_index(info->fields, struct marker_field, i); + if (field->static_offset) { + offset = field->offset; + break; + } + } - if (field->static_offset) - continue; + for (; i < info->fields->len; i++) { + field = &g_array_index(info->fields, struct marker_field, i); switch (field->type) { case LTT_TYPE_SIGNED_INT: diff --git a/ltt/branches/poly/ltt/tracefile.c b/ltt/branches/poly/ltt/tracefile.c index 71d8d4e2..56b103b9 100644 --- a/ltt/branches/poly/ltt/tracefile.c +++ b/ltt/branches/poly/ltt/tracefile.c @@ -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) { @@ -1102,8 +1102,8 @@ int ltt_process_facility_tracefile(LttTracefile *tf) g_debug("Doing MARKER_ID_SET_MARKER_ID of marker %s", marker_name); pos += strlen(marker_name) + 1; //remove genevent compatibility - //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 += 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; @@ -1126,11 +1126,11 @@ int ltt_process_facility_tracefile(LttTracefile *tf) marker_name); pos += strlen(marker_name) + 1; //break genevent. - //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); format = pos; pos += strlen(format) + 1; //break genevent - //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); marker_format_event(tf->trace, g_quark_from_string(marker_name), format); /* get information from dictionnary TODO */ @@ -1754,10 +1754,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) { @@ -1836,7 +1836,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; @@ -1992,7 +1992,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); @@ -2014,18 +2014,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; -- 2.34.1