fix detailed event list behavior
[lttv.git] / ltt / branches / poly / lttv / lttv / tracecontext.c
index 73096b3d0e4dceeeb145abb949f038f41e470749..ca7f4ea414c9370b4d7e4a33cb541b1ea72c380c 100644 (file)
@@ -21,6 +21,7 @@
 #endif
 
 #include <string.h>
+#include <lttv/lttv.h>
 #include <lttv/tracecontext.h>
 #include <ltt/event.h>
 #include <ltt/facility.h>
@@ -170,6 +171,7 @@ static void init_tracefile_context(LttTracefile *tracefile,
   tfc->event = lttv_hooks_new();
   tfc->event_by_id = lttv_hooks_by_id_new();
   tfc->a = g_object_new(LTTV_ATTRIBUTE_TYPE, NULL);
+  tfc->target_pid = -1;
 }
 
 
@@ -703,7 +705,7 @@ guint lttv_process_traceset_middle(LttvTracesetContext *self,
 
   //enum read_state last_read_state = LAST_NONE;
 
-  gboolean last_ret = FALSE; /* return value of the last hook list called */
+  gint last_ret = 0; /* return value of the last hook list called */
 
   /* Get the next event from the pqueue, call its hooks, 
      reinsert in the pqueue the following event from the same tracefile 
@@ -766,11 +768,24 @@ guint lttv_process_traceset_middle(LttvTracesetContext *self,
     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);
-    
-    read_ret = ltt_tracefile_read(tfc->tf);
 
+#if 0
+    /* This is buggy : it won't work well with state computation */
+   if(unlikely(last_ret == 2)) {
+      /* This is a case where we want to stay at this position and stop read. */
+           g_tree_insert(pqueue, tfc, tfc);
+      return count - 1;
+    }
+#endif //0
+    read_ret = ltt_tracefile_read(tfc->tf);
+    
+   
     if(likely(!read_ret)) {
       //g_debug("An event is ready");
       tfc->timestamp = ltt_event_time(e);
@@ -940,27 +955,11 @@ gboolean lttv_process_traceset_seek_position(LttvTracesetContext *self,
 static LttField *
 find_field(LttEventType *et, const GQuark field)
 {
-  LttType *t;
-
-  LttField *f;
-
-  guint i, nb;
-
   GQuark name;
 
-  /* Field is unset */
   if(field == 0) return NULL;
   
-  f = ltt_eventtype_field(et);
-  t = ltt_eventtype_type(et);
-  g_assert(ltt_type_class(t) == LTT_STRUCT);
-  nb = ltt_type_member_number(t);
-  for(i = 0 ; i < nb ; i++) {
-    ltt_type_member_type(t, i, &name);
-    if(name == field) break;
-  }
-  g_assert(i < nb);
-  return ltt_field_member(f, i);
+  return ltt_eventtype_field_by_name(et, field);
 }
 
 LttvTraceHookByFacility *lttv_trace_hook_get_fac(LttvTraceHook *th, 
@@ -1070,8 +1069,9 @@ event_error:
       g_quark_to_string(event));
   goto free;
 facility_error:
-  g_error("No %s facility", g_quark_to_string(facility));
-  goto free;
+  //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);
@@ -1250,11 +1250,13 @@ gint lttv_traceset_context_pos_pos_compare(
   int i, j;
   int ret = 0;
   
-  if(pos1->tfcp->len == 0) {
-    if(pos2->tfcp->len == 0) return 0;
-    else return 1;
+  if(ltt_time_compare(pos1->timestamp, ltt_time_infinite) == 0) {
+    if(ltt_time_compare(pos2->timestamp, ltt_time_infinite) == 0)
+      return 0;
+    else 
+      return 1;
   }
-  if(pos2->tfcp->len == 0)
+  if(ltt_time_compare(pos2->timestamp, ltt_time_infinite) == 0)
     return -1;
   
   for(i=0;i<pos1->tfcp->len;i++) {
@@ -1335,7 +1337,13 @@ struct seek_back_data {
   guint events_found;
   guint n;             /* number of events requested */
   GPtrArray *array; /* array of LttvTracesetContextPositions pointers */
-  LttvFilter *filter;
+  LttvFilter *filter1;
+  LttvFilter *filter2;
+  LttvFilter *filter3;
+  gpointer data;
+  check_handler *check;
+  gboolean *stop_flag;
+  guint raw_event_count;
 };
 
 static gint seek_back_event_hook(void *hook_data, void* call_data)
@@ -1345,15 +1353,35 @@ static gint seek_back_event_hook(void *hook_data, void* call_data)
   LttvTracesetContext *tsc = tfc->t_context->ts_context;
   LttvTracesetContextPosition *pos;
 
-  if(sd->filter != NULL && sd->filter->head != NULL) {
-    if(!lttv_filter_tree_parse(sd->filter->head,
+  if(sd->check && sd->check(sd->raw_event_count, sd->stop_flag, sd->data))
+    return TRUE;
+  sd->raw_event_count++;
+
+  if(sd->filter1 != NULL && sd->filter1->head != NULL && 
+    !lttv_filter_tree_parse(sd->filter1->head,
           ltt_tracefile_get_event(tfc->tf),
           tfc->tf,
           tfc->t_context->t,
-          tfc))
-      return FALSE;
+          tfc)) {
+         return FALSE;
   }
-  
+  if(sd->filter2 != NULL && sd->filter2->head != NULL && 
+    !lttv_filter_tree_parse(sd->filter2->head,
+          ltt_tracefile_get_event(tfc->tf),
+          tfc->tf,
+          tfc->t_context->t,
+          tfc)) {
+         return FALSE;
+  }
+  if(sd->filter3 != NULL && sd->filter3->head != NULL && 
+    !lttv_filter_tree_parse(sd->filter3->head,
+          ltt_tracefile_get_event(tfc->tf),
+          tfc->tf,
+          tfc->t_context->t,
+          tfc)) {
+         return FALSE;
+  }
+
   pos = (LttvTracesetContextPosition*)g_ptr_array_index (sd->array,
                                                          sd->first_event);
 
@@ -1396,7 +1424,12 @@ static gint seek_back_event_hook(void *hook_data, void* call_data)
 guint lttv_process_traceset_seek_n_backward(LttvTracesetContext *self,
                                             guint n, LttTime first_offset,
                                             seek_time_fct time_seeker,
-                                            LttvFilter *filter)
+                                            check_handler *check,
+                                            gboolean *stop_flag,
+                                           LttvFilter *filter1,
+                                           LttvFilter *filter2,
+                                           LttvFilter *filter3,
+                                           gpointer data)
 {
   if(lttv_traceset_number(self->ts) == 0) return 0;
   g_assert(ltt_time_compare(first_offset, ltt_time_zero) != 0);
@@ -1417,8 +1450,14 @@ guint lttv_process_traceset_seek_n_backward(LttvTracesetContext *self,
   sd.first_event = 0;
   sd.events_found = 0;
   sd.array = g_ptr_array_sized_new(n);
-  sd.filter = filter;
+  sd.filter1 = filter1;
+  sd.filter2 = filter2;
+  sd.filter3 = filter3;
+  sd.data = data;
   sd.n = n;
+  sd.check = check;
+  sd.stop_flag = stop_flag;
+  sd.raw_event_count = 0;
   g_ptr_array_set_size(sd.array, n);
   for(i=0;i<n;i++) {
     g_ptr_array_index (sd.array, i) = lttv_traceset_context_position_new(self);
@@ -1524,7 +1563,13 @@ guint lttv_process_traceset_seek_n_backward(LttvTracesetContext *self,
 struct seek_forward_data {
   guint event_count;  /* event counter */
   guint n;            /* requested number of events to jump over */
-  LttvFilter *filter;
+  LttvFilter *filter1;
+  LttvFilter *filter2;
+  LttvFilter *filter3;
+  gpointer data;
+  check_handler *check;
+  gboolean *stop_flag;
+  guint raw_event_count;  /* event counter */
 };
 
 static gint seek_forward_event_hook(void *hook_data, void* call_data)
@@ -1532,24 +1577,42 @@ static gint seek_forward_event_hook(void *hook_data, void* call_data)
   struct seek_forward_data *sd = (struct seek_forward_data*)hook_data;
   LttvTracefileContext *tfc = (LttvTracefileContext*)call_data;
 
-  if(sd->filter != NULL) {
-    if(!lttv_filter_tree_parse(sd->filter->head,
+  if(sd->check && sd->check(sd->raw_event_count, sd->stop_flag, sd->data))
+    return TRUE;
+  sd->raw_event_count++;
+
+  if(sd->filter1 != NULL && sd->filter1->head != NULL && 
+    !lttv_filter_tree_parse(sd->filter1->head,
           ltt_tracefile_get_event(tfc->tf),
           tfc->tf,
           tfc->t_context->t,
-          tfc))
-      return FALSE;
+          tfc)) {
+         return FALSE;
+  }
+  if(sd->filter2 != NULL && sd->filter2->head != NULL && 
+    !lttv_filter_tree_parse(sd->filter2->head,
+          ltt_tracefile_get_event(tfc->tf),
+          tfc->tf,
+          tfc->t_context->t,
+          tfc)) {
+         return FALSE;
+  }
+  if(sd->filter3 != NULL && sd->filter3->head != NULL && 
+    !lttv_filter_tree_parse(sd->filter3->head,
+          ltt_tracefile_get_event(tfc->tf),
+          tfc->tf,
+          tfc->t_context->t,
+          tfc)) {
+         return FALSE;
   }
-  sd->event_count++;
 
+  sd->event_count++;
   if(sd->event_count >= sd->n)
-    return TRUE;
-  else
-    return FALSE;
+      return TRUE;
 }
 
-/* Seek back n events forward from the current position
+/* Seek back n events forward from the current position (1 to n)
+ * 0 is ok too, but it will actually do nothing.
  *
  * Parameters :
  * @self   the trace set context
@@ -1559,12 +1622,27 @@ static gint seek_forward_event_hook(void *hook_data, void* call_data)
  * returns : the number of events jumped over (may be less than requested if end
  * of traceset reached) */
 guint lttv_process_traceset_seek_n_forward(LttvTracesetContext *self,
-                                          guint n, LttvFilter *filter)
+                                          guint n,
+                                          check_handler *check,
+                                          gboolean *stop_flag,
+                                         LttvFilter *filter1,
+                                         LttvFilter *filter2,
+                                         LttvFilter *filter3,
+                                         gpointer data)
 {
   struct seek_forward_data sd;
   sd.event_count = 0;
   sd.n = n;
-  sd.filter = filter;
+  sd.filter1 = filter1;
+  sd.filter2 = filter2;
+  sd.filter3 = filter3;
+  sd.data = data;
+  sd.check = check;
+  sd.stop_flag = stop_flag;
+  sd.raw_event_count = 0;
+  
+  if(sd.event_count >= sd.n) return sd.event_count;
+  
   LttvHooks *hooks = lttv_hooks_new();
 
   lttv_hooks_add(hooks, seek_forward_event_hook, &sd, LTTV_PRIO_DEFAULT);
@@ -1578,7 +1656,9 @@ guint lttv_process_traceset_seek_n_forward(LttvTracesetContext *self,
         G_MAXUINT, NULL);
 
   /* Here, our position is either the end of traceset, or the exact position
-   * after n events : leave it like this. */
+   * after n events : leave it like this. This might be placed on an event that
+   * will be filtered out, we don't care : all we know is that the following
+   * event filtered in will be the right one. */
 
   lttv_process_traceset_end(self, NULL, NULL, NULL, hooks, NULL);
 
This page took 0.026961 seconds and 4 git commands to generate.