change find_field
[lttv.git] / ltt / branches / poly / lttv / lttv / tracecontext.c
index 8634b1be564dc835ebddcac73495b71e586e6670..37147f8c32b35b45e5f97e11282e181c846c19e8 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>
@@ -772,12 +773,14 @@ guint lttv_process_traceset_middle(LttvTracesetContext *self,
     last_ret = lttv_hooks_call_merge(tfc->event, tfc,
                         lttv_hooks_by_id_get(tfc->event_by_id, id), tfc);
 
+#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);
     
    
@@ -950,27 +953,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, 
@@ -1544,25 +1531,20 @@ 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->filter == NULL || lttv_filter_tree_parse(sd->filter->head,
           ltt_tracefile_get_event(tfc->tf),
           tfc->tf,
           tfc->t_context->t,
-          tfc))
-      return FALSE;
-  }
-
-  if(sd->event_count >= sd->n)
-    return 2; /* Stay at the same position */
-  else {
+          tfc)) {
     sd->event_count++;
-    return FALSE;
+    if(sd->event_count >= sd->n)
+      return TRUE;
   }
+  return FALSE;
 }
 
-/* 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
@@ -1578,6 +1560,9 @@ guint lttv_process_traceset_seek_n_forward(LttvTracesetContext *self,
   sd.event_count = 0;
   sd.n = n;
   sd.filter = filter;
+  
+  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);
@@ -1591,7 +1576,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.024253 seconds and 4 git commands to generate.