fix trace_find_hook
[lttv.git] / ltt / branches / poly / lttv / lttv / tracecontext.c
index 8f1ad49bc8e2cbee8533d05c48b8c0e09b145823..39ee2950b66c443350c6dafb23c7e5e309c543d6 100644 (file)
@@ -691,8 +691,6 @@ guint lttv_process_traceset_middle(LttvTracesetContext *self,
 {
   GTree *pqueue = self->pqueue;
 
-  guint fac_id, ev_id, id;
-
   LttvTracefileContext *tfc;
 
   LttEvent *e;
@@ -763,15 +761,12 @@ guint lttv_process_traceset_middle(LttvTracesetContext *self,
      * first pass (not if last read returned end of tracefile) */
     count++;
     
-    fac_id = ltt_event_facility_id(e);
-    ev_id = ltt_event_eventtype_id(e);
-    id = GET_HOOK_ID(fac_id, ev_id);
     tfc->target_pid = -1; /* unset target PID */
     /* Hooks : 
      * return values : 0 : continue read, 1 : go to next position and stop read,
      * 2 : stay at the current position and stop read */
     last_ret = lttv_hooks_call_merge(tfc->event, tfc,
-                        lttv_hooks_by_id_get(tfc->event_by_id, id), tfc);
+                        lttv_hooks_by_id_get(tfc->event_by_id, e->event_id), tfc);
 
 #if 0
     /* This is buggy : it won't work well with state computation */
@@ -949,7 +944,7 @@ gboolean lttv_process_traceset_seek_position(LttvTracesetContext *self,
 }
 
 
-
+#if 0 // pmf: temporary disable
 static LttField *
 find_field(LttEventType *et, const GQuark field)
 {
@@ -966,108 +961,81 @@ find_field(LttEventType *et, const GQuark field)
 
   return f;
 }
+#endif
 
-LttvTraceHookByFacility *lttv_trace_hook_get_fac(LttvTraceHook *th, 
-                                                 guint facility_id)
-{
-  return &g_array_index(th->fac_index, LttvTraceHookByFacility, facility_id);
-}
-
-struct marker_info *lttv_trace_hook_get_marker(LttvTraceHook *th)
+struct marker_info *lttv_trace_hook_get_marker(LttTrace *t, LttvTraceHook *th)
 {
-  g_assert(th->fac_list->len > 0);
-  return g_array_index(th->fac_list, LttvTraceHookByFacility*, 0);
+  return marker_get_info_from_id(t, th->id);
 }
 
 
-/* Returns 0 on success, -1 if fails. */
-gint
-lttv_trace_find_hook(LttTrace *t, GQuark event, 
-    GQuark field1, GQuark field2, GQuark field3, LttvHook h, gpointer hook_data,
-    LttvTraceHook *th)
+int lttv_trace_find_hook(LttTrace *t, GQuark marker_name,
+    GQuark fields[], LttvHook h, gpointer hook_data, GArray **trace_hooks)
 {
-  LttEventType *et, *first_et;
-
   struct marker_info *info;
+  struct marker_field *field;
+  guint16 marker_id;
+  int init_array_size;
 
-  guint i, ev_id;
-
-  head = marker_get_info_from_name(t, event);
-
-  if(unlikely(head == NULL))
-    goto facility_error;
-
-  ev_id = marker_get_id_from_info(t, info);
-  
-  th->h = h;
-  th->id = ev_id;
-  th->f1 = find_field(et, field1);
-  th->f2 = find_field(et, field2);
-  th->f3 = find_field(et, field3);
-  th->hook_data = hook_data;
-  
-  first_thf = thf;
-  first_et = et;
-
-  /* Check for type compatibility too */
-  for(i=1;i<facilities->len;i++) {
-    fac_id = g_array_index(facilities, guint, i);
-    f = ltt_trace_get_facility_by_num(t, fac_id);
-
-    et = ltt_facility_eventtype_get_by_name(f, event);
-    if(unlikely(et == NULL)) goto event_error;
-    
-    thf = &g_array_index(th->fac_index, LttvTraceHookByFacility, fac_id);
-    g_array_index(th->fac_list, LttvTraceHookByFacility*, i) = thf;
-    ev_id = ltt_eventtype_id(et);
-    thf->h = h;
-    thf->id = GET_HOOK_ID(fac_id, ev_id);
-    thf->f1 = find_field(et, field1);
-    if(check_fields_compatibility(first_et, et,
-        first_thf->f1, thf->f1))
-      goto type_error;
-        
-    thf->f2 = find_field(et, field2);
-    if(check_fields_compatibility(first_et, et,
-        first_thf->f2, thf->f2))
-      goto type_error;
-
-    thf->f3 = find_field(et, field3);
-    if(check_fields_compatibility(first_et, et,
-        first_thf->f3, thf->f3))
-      goto type_error;
-    thf->hook_data = hook_data;
+  info = marker_get_info_from_name(t, marker_name);
+  if(unlikely(info == NULL)) {
+    return NULL;
   }
 
-  return 0;
-
-type_error:
-  goto free;
-event_error:
-  g_error("Event type does not exist for event %s", 
-      g_quark_to_string(event));
-  goto free;
-facility_error:
-  //Ignore this type of error : some facilities are not required.
-       //g_error("No %s facility", g_quark_to_string(facility));
-  return -1;
-free:
-  g_array_free(th->fac_index, TRUE);
-  g_array_free(th->fac_list, TRUE);
-  th->fac_index = NULL;
-  th->fac_list = NULL;
-  return -1;
+  init_array_size = (*trace_hooks)->len;
+
+  /* for each marker with the requested name */
+  do {
+    LttvTraceHook tmpth;
+    int found;
+    GQuark f;
+
+    marker_id = marker_get_id_from_info(t, info);
+
+    tmpth.h = h;
+    tmpth.id = marker_id;
+    tmpth.hook_data = hook_data;
+    tmpth.fields = g_ptr_array_new();
+
+    /* for each field requested */
+    for(f = fields; *f != 0; f++) {
+      found = 0;
+      for_each_marker_field(marker_field, info) {
+        if(marker_fieldfield->name == *f) {
+          found = 1;
+          g_ptr_array_add(tmpth.fields, marker_field);
+          break;
+        }
+      }
+      if(!found) {
+        /* Did not find the one of the fields in this instance of the
+           marker. Print a warning and skip this marker completely.
+          Still iterate on other markers with same name. */
+        g_ptr_array_free(tmpth.fields, TRUE);
+        g_warning("Field %s cannot be found in marker %s",
+                g_quark_to_string(*f), g_quark_to_string(marker_name));
+        goto skip_marker;
+      }
+    }
+    /* all fields were found: add the tracehook to the array */
+    *trace_hooks = g_array_append_val(*trace_hooks, tmpth);
+skip_marker:
+    info = info->next;
+  } while(info != NULL);
+
+  /* Error if no new trace hook has been added */
+  return (init_array_size == (*trace_hooks)->len);
 }
 
-void lttv_trace_hook_destroy(LttvTraceHook *th)
+void lttv_trace_hook_destroy(GArray **th)
 {
-  g_array_free(th->fac_index, TRUE);
-  g_array_free(th->fac_list, TRUE);
+  int i;
+  for(i=0; i<th->len; i++) {
+    g_ptr_array_free(g_array_index(th, LttvTraceHook, i).fields, TRUE);
+  }
+  *th = g_array_remove_range(*th, 0, th->len);
 }
 
-
-
-
 LttvTracesetContextPosition *lttv_traceset_context_position_new(
                                         const LttvTracesetContext *self)
 {
This page took 0.025188 seconds and 4 git commands to generate.