seek forward fix for good interaction with state.c
[lttv.git] / ltt / branches / poly / lttv / lttv / tracecontext.c
index ea7cdf62eddc00e7798f67c1b2d4d255a8db41fa..9eaec78395e32be88422873dd500dabf83bc6ade 100644 (file)
@@ -703,7 +703,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 +766,23 @@ 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);
+    /* 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);
@@ -1250,11 +1262,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++) {
@@ -1409,8 +1423,8 @@ guint lttv_process_traceset_seek_n_backward(LttvTracesetContext *self,
   LttvTracesetContextPosition *saved_pos =
     lttv_traceset_context_position_new(self);
   LttTime time;
+  LttTime asked_time;
   LttTime time_offset;
-  LttTime last_time = ltt_time_infinite;
   struct seek_back_data sd;
   LttvHooks *hooks = lttv_hooks_new();
   
@@ -1432,6 +1446,7 @@ guint lttv_process_traceset_seek_n_backward(LttvTracesetContext *self,
   if(ltt_time_compare(time, self->time_span.end_time) > 0) {
     time = self->time_span.end_time;
   }
+  asked_time = time;
   time_offset = first_offset;
  
   lttv_hooks_add(hooks, seek_back_event_hook, &sd, LTTV_PRIO_DEFAULT);
@@ -1440,14 +1455,15 @@ guint lttv_process_traceset_seek_n_backward(LttvTracesetContext *self,
 
   while(1) {
     /* stop criteria : - n events found
-     *                 - time < beginning of trace */
-    if(ltt_time_compare(time, self->time_span.start_time) < 0) break;
+     *                 - asked_time < beginning of trace */
+    if(ltt_time_compare(asked_time, self->time_span.start_time) < 0) break;
 
     lttv_traceset_context_position_copy(end_pos, next_iter_end_pos);
 
     /* We must seek the traceset back to time - time_offset */
     /* this time becomes the new reference time */
     time = ltt_time_sub(time, time_offset);
+    asked_time = time;
     
     time_seeker(self, time);
     lttv_traceset_context_position_save(self, next_iter_end_pos);
@@ -1456,10 +1472,6 @@ guint lttv_process_traceset_seek_n_backward(LttvTracesetContext *self,
     if(ltt_time_compare(time, self->time_span.end_time) > 0) {
       time = self->time_span.end_time;
     }
-    /* if we have the same time twice, it means we are at the beginning of the
-     * trace, and we seek back at the same position */
-    if(ltt_time_compare(last_time, time) == 0) break;
-    last_time = time;
 
     /* Process the traceset, calling a hook which adds events 
      * to the array, overwriting the tail. It changes first_event and
@@ -1534,24 +1546,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;
+          tfc)) {
+    sd->event_count++;
+    if(sd->event_count >= sd->n)
+      return TRUE;
   }
-  sd->event_count++;
-
-  if(sd->event_count >= sd->n)
-    return TRUE;
-  else
-    return FALSE;
+  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
@@ -1567,6 +1575,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);
@@ -1580,7 +1591,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.026432 seconds and 4 git commands to generate.