add facility arg to find hooks
[lttv.git] / ltt / branches / poly / lttv / lttv / tracecontext.c
index f2fd441349f55dae52228ce5ba0faed0b70f8e63..71c9598730053c7aed0337d714cb806c000cddd2 100644 (file)
@@ -968,30 +968,47 @@ struct marker_info *lttv_trace_hook_get_marker(LttTrace *t, LttvTraceHook *th)
   return marker_get_info_from_id(t, th->id);
 }
 
+static inline GQuark lttv_merge_facility_event_name(GQuark fac, GQuark ev)
+{
+  char *tmp;
+  const char *sfac, *sev;
+  GQuark ret;
+
+  sfac = g_quark_to_string(fac);
+  sev = g_quark_to_string(ev);
+  tmp = g_new(char, strlen(sfac) + strlen(sev) + 3); /* 3: _ \0 \0 */
+  strcpy(tmp, sfac);
+  strcat(tmp, "_");
+  strcat(tmp, sev);
+  ret = g_quark_from_string(tmp);
+  g_free(tmp);
+  return ret;
+}
 
-GArray *lttv_trace_find_hook(LttTrace *t, GQuark marker_name,
-    GQuark fields[], LttvHook h, gpointer hook_data)
+int lttv_trace_find_hook(LttTrace *t, GQuark facility_name, GQuark event_name,
+    GQuark fields[], LttvHook h, gpointer hook_data, GArray **trace_hooks)
 {
   struct marker_info *info;
-  GQuark *pfieldname;
-  struct marker_field *field;
   guint16 marker_id;
+  int init_array_size;
+  GQuark marker_name;
 
-  GArray * retval;
+  marker_name = lttv_merge_facility_event_name(facility_name, event_name);
 
   info = marker_get_info_from_name(t, marker_name);
   if(unlikely(info == NULL)) {
-    return NULL;
+    g_warning("No marker of name %s found", g_quark_to_string(marker_name));
+    return 1;
   }
 
-  retval = g_array_new(FALSE, FALSE, sizeof(LttvTraceHook));
-
-  
+  init_array_size = (*trace_hooks)->len;
 
   /* for each marker with the requested name */
   do {
     LttvTraceHook tmpth;
     int found;
+    GQuark *f;
+    struct marker_field *marker_field;
 
     marker_id = marker_get_id_from_info(t, info);
 
@@ -1001,52 +1018,49 @@ GArray *lttv_trace_find_hook(LttTrace *t, GQuark marker_name,
     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) {
-          
+    for(f = fields; f && *f != 0; f++) {
+      found = 0;
+      for_each_marker_field(marker_field, info) {
+        if(marker_field->name == *f) {
           found = 1;
-          g_ptr_array_add(tmpth.fields, field);
+          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. Skip it. */
+           marker. Print a warning and skip this marker completely.
+          Still iterate on other markers with same name. */
         g_ptr_array_free(tmpth.fields, TRUE);
-        goto free_retval;
+        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 */
-    g_array_append_val(retval, tmpth);
-
+    *trace_hooks = g_array_append_val(*trace_hooks, tmpth);
+skip_marker:
     info = info->next;
   } while(info != NULL);
 
-
-  if(retval->len)
-    return retval;
-
-  free_retval:
-  g_array_free(retval, TRUE);
-  return NULL;
+  /* Error if no new trace hook has been added */
+  if (init_array_size == (*trace_hooks)->len) {
+        g_warning("No marker of name %s has all requested fields",
+                g_quark_to_string(marker_name));
+        return 1;
+  }
+  return 0;
 }
 
-void lttv_trace_hook_destroy(GArray *th)
+void lttv_trace_hook_remove_all(GArray **th)
 {
   int i;
-  for(i=0; i<th->len; i++) {
-    g_ptr_array_free(g_array_index(th, LttvTraceHook, i).fields, TRUE);
+  for(i=0; i<(*th)->len; i++) {
+    g_ptr_array_free(g_array_index(*th, LttvTraceHook, i).fields, TRUE);
   }
-
-  g_array_free(th, TRUE);
+  *th = g_array_remove_range(*th, 0, (*th)->len);
 }
 
-
-
-
 LttvTracesetContextPosition *lttv_traceset_context_position_new(
                                         const LttvTracesetContext *self)
 {
@@ -1567,6 +1581,7 @@ static gint seek_forward_event_hook(void *hook_data, void* call_data)
   sd->event_count++;
   if(sd->event_count >= sd->n)
       return TRUE;
+  return FALSE;
 }
 
 /* Seek back n events forward from the current position (1 to n)
This page took 0.024585 seconds and 4 git commands to generate.