update quickstart and flight
[lttv.git] / trunk / lttv / lttv / lttv / filter.c
index f62755868f27f8958e4b13989556d2ef6effd5d1..3c53e38791c7fd081a407015fc2503d1575883ae 100644 (file)
@@ -101,6 +101,26 @@ lttv_simple_expression_new() {
   return se;
 }
 
+/*
+ * Keeps the array order.
+ */
+static inline gpointer ltt_g_ptr_array_remove_index_slow(GPtrArray *fp,
+    int index)
+{
+  gpointer ptr;
+  int i;
+
+  if (fp->len == 0)
+    return NULL;
+
+  ptr = g_ptr_array_index(fp, index);
+  for (i = index; i < fp->len - 1; i++) {
+    g_ptr_array_index(fp, i) = g_ptr_array_index(fp, i + 1);
+  }
+  g_ptr_array_remove_index(fp, fp->len - 1);
+  return ptr;
+}
+
 /**
  *  @fn gboolean lttv_simple_expression_assign_field(GPtrArray*,LttvSimpleExpression*)
  * 
@@ -115,10 +135,11 @@ gboolean
 lttv_simple_expression_assign_field(GPtrArray* fp, LttvSimpleExpression* se) {
 
   GString* f = NULL;
-  
+
   if(fp->len < 2) return FALSE;
-  g_assert((f=g_ptr_array_remove_index(fp,0))); 
-  
+  g_assert((f=ltt_g_ptr_array_remove_index_slow(fp,0)));
+
+
   /*
    * Parse through the specified 
    * hardcoded fields.
@@ -132,13 +153,14 @@ lttv_simple_expression_assign_field(GPtrArray* fp, LttvSimpleExpression* se) {
    * subfields, it will be considered 
    * as a dynamic field
    */
+
   if(!g_strcasecmp(f->str,"trace") ) {
     /*
      * Possible values:
      *  trace.name
      */
     g_string_free(f,TRUE);
-    f=g_ptr_array_remove_index(fp,0);
+    f=ltt_g_ptr_array_remove_index_slow(fp,0);
     if(!g_strcasecmp(f->str,"name")) {
       se->field = LTTV_FILTER_TRACE_NAME;    
     }
@@ -152,7 +174,7 @@ lttv_simple_expression_assign_field(GPtrArray* fp, LttvSimpleExpression* se) {
      *  tracefile.name
      */
     g_string_free(f,TRUE);
-    f=g_ptr_array_remove_index(fp,0);
+    f=ltt_g_ptr_array_remove_index_slow(fp,0);
     if(!g_strcasecmp(f->str,"name")) {
       se->field = LTTV_FILTER_TRACEFILE_NAME;
     }
@@ -171,7 +193,7 @@ lttv_simple_expression_assign_field(GPtrArray* fp, LttvSimpleExpression* se) {
      *  state.cpu
      */
     g_string_free(f,TRUE);
-    f=g_ptr_array_remove_index(fp,0);
+    f=ltt_g_ptr_array_remove_index_slow(fp,0);
     if(!g_strcasecmp(f->str,"pid") ) { 
       se->field = LTTV_FILTER_STATE_PID; 
     }
@@ -213,7 +235,8 @@ lttv_simple_expression_assign_field(GPtrArray* fp, LttvSimpleExpression* se) {
      *  event.field
      */
     g_string_free(f,TRUE);
-    f=g_ptr_array_remove_index(fp,0);
+    f=ltt_g_ptr_array_remove_index_slow(fp,0);
+
     if(!g_strcasecmp(f->str,"name") ) {
       se->field = LTTV_FILTER_EVENT_NAME;
     }
@@ -235,16 +258,16 @@ lttv_simple_expression_assign_field(GPtrArray* fp, LttvSimpleExpression* se) {
     else if(!g_strcasecmp(f->str,"field") ) {
       se->field = LTTV_FILTER_EVENT_FIELD;
       g_string_free(f,TRUE);
-      f=g_ptr_array_remove_index(fp,0);
+      f=ltt_g_ptr_array_remove_index_slow(fp,0);
 
     } else {
-      g_string_free(f,TRUE);
-      f=g_ptr_array_remove_index(fp,0);
+      //g_string_free(f,TRUE);
+      //f=ltt_g_ptr_array_remove_index_slow(fp,0);
       g_warning("Unknown event filter subtype %s", f->str);
     }
   } else {
     g_string_free(f,TRUE);
-    f=g_ptr_array_remove_index(fp,0);
+    f=ltt_g_ptr_array_remove_index_slow(fp,0);
 
     g_warning("Unrecognized field in filter string");
   }
@@ -1666,7 +1689,7 @@ lttv_filter_update(LttvFilter* filter) {
   g_ptr_array_free(a_field_path,TRUE);
 
   /* free the tree stack -- but keep the root tree */
-  filter->head = g_ptr_array_remove_index(tree_stack,0);
+  filter->head = ltt_g_ptr_array_remove_index_slow(tree_stack,0);
   g_ptr_array_free(tree_stack,TRUE);
   
   /* free the field buffer if allocated */
@@ -2024,7 +2047,8 @@ lttv_filter_tree_parse_branch(
             if(event == NULL) return TRUE;
             else {
               struct marker_info *info;
-              info = marker_get_info_from_id((LttTrace *)trace, event->event_id);
+             LttTracefile *tf = context->tf;
+              info = marker_get_info_from_id(tf->mdata, event->event_id);
               g_assert(info != NULL);
               GQuark quark = info->name;
               return se->op((gpointer)&quark,v);
This page took 0.024376 seconds and 4 git commands to generate.