lttv_trace_find_hook(): convert for new arch and unlimited fields
authorpmf <pmf@04897980-b3bd-0310-b5e0-8ef037075253>
Wed, 10 Oct 2007 16:22:12 +0000 (16:22 +0000)
committerpmf <pmf@04897980-b3bd-0310-b5e0-8ef037075253>
Wed, 10 Oct 2007 16:22:12 +0000 (16:22 +0000)
git-svn-id: http://ltt.polymtl.ca/svn@2621 04897980-b3bd-0310-b5e0-8ef037075253

ltt/branches/poly/lttv/lttv/tracecontext.c
ltt/branches/poly/lttv/lttv/tracecontext.h

index a6ff811e0a622ce1ad45398164ab5e9418cbe703..f2fd441349f55dae52228ce5ba0faed0b70f8e63 100644 (file)
@@ -969,88 +969,79 @@ struct marker_info *lttv_trace_hook_get_marker(LttTrace *t, LttvTraceHook *th)
 }
 
 
-/* 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)
+GArray *lttv_trace_find_hook(LttTrace *t, GQuark marker_name,
+    GQuark fields[], LttvHook h, gpointer hook_data)
 {
-//  LttEventType *et, *first_et;
-
   struct marker_info *info;
+  GQuark *pfieldname;
+  struct marker_field *field;
+  guint16 marker_id;
 
-  guint i, ev_id;
+  GArray * retval;
 
-  info = marker_get_info_from_name(t, event);
+  info = marker_get_info_from_name(t, marker_name);
+  if(unlikely(info == NULL)) {
+    return NULL;
+  }
 
-  if(unlikely(info == NULL))
-    goto facility_error;
+  retval = g_array_new(FALSE, FALSE, sizeof(LttvTraceHook));
 
-  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);
+  /* for each marker with the requested name */
+  do {
+    LttvTraceHook tmpth;
+    int found;
+
+    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 */
+    found = 0;
+    for(pfieldname = fields; pfieldname != NULL; pfieldname++) {
+      for_each_marker_field(field, info) {
+        if(field->name == *pfieldname) {
+          
+          found = 1;
+          g_ptr_array_add(tmpth.fields, field);
+          break;
+        }
+      }
+      if(!found) {
+        /* Did not find the one of the fields in this instance of the
+           marker. Skip it. */
+        g_ptr_array_free(tmpth.fields, TRUE);
+        goto free_retval;
+      }
+    }
+
+    /* all fields were found: add the tracehook to the array */
+    g_array_append_val(retval, tmpth);
 
-//    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 = info->next;
+  } while(info != 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;
+  if(retval->len)
+    return retval;
+
+  free_retval:
+  g_array_free(retval, TRUE);
+  return NULL;
 }
 
-void lttv_trace_hook_destroy(LttvTraceHook *th)
+void lttv_trace_hook_destroy(GArray *th)
 {
-  // nothing to do
+  int i;
+  for(i=0; i<th->len; i++) {
+    g_ptr_array_free(g_array_index(th, LttvTraceHook, i).fields, TRUE);
+  }
+
+  g_array_free(th, TRUE);
 }
 
 
index af65046378cdc819394fe96c7cdc1c8bd1f4160f..df15a56c2e67cc1998b0ef9353cc58fe76fd37b6 100644 (file)
@@ -274,30 +274,30 @@ void lttv_tracefile_context_remove_hooks_by_id(LttvTracefileContext *self,
 
 typedef struct _LttvTraceHook {
   LttvHook h;
-  guint id;  /* id of the event associated with this hook */
-  struct marker_field *f1;
-  struct marker_field *f2;
-  struct marker_field *f3;
+  guint16 id;  /* id of the marker associated with this hook */
+  GPtrArray *fields;  /* struct marker_fields pointers */
   gpointer hook_data;
 } LttvTraceHook;
 
+#define FIELD_ARRAY(val) ({ (val), 0 })
 
 /* Get the head of marker list correcponding to the given trace hook.
  */
 struct marker_info *lttv_trace_hook_get_marker(LttTrace *t, LttvTraceHook *th);
 
-void lttv_trace_hook_destroy(LttvTraceHook *th);
+void lttv_trace_hook_destroy(GArray *th);
 
 /* Search in the trace for the id of the named event type within the named
    facility. Then, find the three (if non null) named fields. All that
    information is then used to fill the LttvTraceHook structure. This
    is useful to find the specific id for an event within a trace, for
    registering a hook using this structure as event data;
-   it already contains the (up to three) needed fields handles. */
-gint lttv_trace_find_hook(LttTrace *t, GQuark event_type,
-    GQuark field1, GQuark field2, GQuark field3, LttvHook h,
-    gpointer hook_data, LttvTraceHook *th);
+   it already contains the (up to three) needed fields handles.
+   Returns an array of LttvTraceHook, or NULL on error.
+ */
+
+GArray *lttv_trace_find_hook(LttTrace *t, GQuark marker_name,
+    GQuark fields[], LttvHook h, gpointer hook_data);
 
 LttvTracefileContext *lttv_traceset_context_get_current_tfc(
                              LttvTracesetContext *self);
This page took 0.025978 seconds and 4 git commands to generate.