change has_alignment for alignment
authorcompudj <compudj@04897980-b3bd-0310-b5e0-8ef037075253>
Thu, 11 Oct 2007 16:00:44 +0000 (16:00 +0000)
committercompudj <compudj@04897980-b3bd-0310-b5e0-8ef037075253>
Thu, 11 Oct 2007 16:00:44 +0000 (16:00 +0000)
git-svn-id: http://ltt.polymtl.ca/svn@2653 04897980-b3bd-0310-b5e0-8ef037075253

ltt/branches/poly/ltt/ltt-private.h
ltt/branches/poly/ltt/marker.c
ltt/branches/poly/ltt/tracefile.c

index 5f6d3e112bc9c031d780a36c859576253c6af35f..c255916cb6bf5ad95c177d696e4dadffbabecd32 100644 (file)
@@ -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));
 }
 
 
index 07c50f27d3581809dfc4b898bfd7fd0c045db7ee..3e2ab3d68cd4c98cbbac008dd31bf662085dc4e6 100644 (file)
@@ -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:
index 71d8d4e201fe4160434ff15e7317ed90b3083f48..56b103b9c142cf1f4faa36d67f3ed861581f0c45 100644 (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) {
@@ -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;
This page took 0.029864 seconds and 4 git commands to generate.