fix
authorcompudj <compudj@04897980-b3bd-0310-b5e0-8ef037075253>
Sat, 13 Aug 2005 16:45:39 +0000 (16:45 +0000)
committercompudj <compudj@04897980-b3bd-0310-b5e0-8ef037075253>
Sat, 13 Aug 2005 16:45:39 +0000 (16:45 +0000)
git-svn-id: http://ltt.polymtl.ca/svn@1010 04897980-b3bd-0310-b5e0-8ef037075253

ltt/branches/poly/ltt-newlib/event.c
ltt/branches/poly/ltt-newlib/event.h

index 2cc3c15db74f40f7b4323a892c832233be7bc80b..fe299b5dae33ec0fc81344458f041eddae635cd1 100644 (file)
@@ -23,6 +23,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
+#include <glib.h>
 
 #include <asm/types.h>
 #include <linux/byteorder/swab.h>
@@ -411,6 +412,8 @@ guint64 ltt_event_field_element_number(LttEvent *e, LttField *f)
  *    ltt_event_field_element_select
  *                   : Set the currently selected element for a sequence or
  *                     array field
+ *                     O(1) if fields are of fixed size, else O(n) if fields are
+ *                     of variable size.
  *Input params
  *    e              : an instance of an event type
  *    f              : a field of the instance
@@ -422,12 +425,14 @@ void ltt_event_field_element_select(LttEvent *e, LttField *f, unsigned i)
   LttField *field;
   unsigned int k;
   size_t size;
+  LttEventType *event_type;
  
   if(f->field_type->type_class != LTT_ARRAY &&
      f->field_type->type_class != LTT_SEQUENCE)
     return ;
 
   element_number  = ltt_event_field_element_number(e,f);
+  event_type = ltt_event_eventtype(e);
   /* Sanity check for i : 0..n-1 only, and must be lower or equal element_number
    */
   if(i >= element_number) return;
@@ -438,10 +443,18 @@ void ltt_event_field_element_select(LttEvent *e, LttField *f, unsigned i)
     size = f->sequ_number_size;
   else
     size = 0;
+  
+  if(field->fixed_size == FIELD_FIXED) {
+      size += field->field_size * i;
+
+      get_field_type_size(e->tracefile, event_type,
+                  f->offset_root+size, size, field, e->data);
 
-  for(k=0;k<=i;k++){
-    size += get_field_type_size(e->tracefile, event_type,
-                f->offset_root+size, size, field, e->data);
+  } else {
+    for(k=0;k<=i;k++){
+      size += get_field_type_size(e->tracefile, event_type,
+                  f->offset_root+size, size, field, e->data);
+    }
   }
   f->current_element = i;
 }
index 3f1f89725a49fa96f872cdf7785cca4f5ac0ef30..fc50fee9faf020d07dc865baa5bb79c46e0d2cbd 100644 (file)
@@ -19,6 +19,7 @@
 #ifndef EVENT_H
 #define EVENT_H
 
+#include <glib.h>
 #include <ltt/ltt.h>
 
 LttEvent *ltt_event_new();
@@ -96,7 +97,7 @@ void *ltt_event_data(LttEvent *e);
    instance. This function returns the number of elements for an array or 
    sequence field in an event. */
 
-unsigned ltt_event_field_element_number(LttEvent *e, LttField *f);
+guint64 ltt_event_field_element_number(LttEvent *e, LttField *f);
 
 
 /* Set the currently selected element for a sequence or array field. */
This page took 0.025155 seconds and 4 git commands to generate.