seek forward fix for good interaction with state.c
authorcompudj <compudj@04897980-b3bd-0310-b5e0-8ef037075253>
Tue, 13 Sep 2005 02:09:59 +0000 (02:09 +0000)
committercompudj <compudj@04897980-b3bd-0310-b5e0-8ef037075253>
Tue, 13 Sep 2005 02:09:59 +0000 (02:09 +0000)
git-svn-id: http://ltt.polymtl.ca/svn@1172 04897980-b3bd-0310-b5e0-8ef037075253

ltt/branches/poly/lttv/lttv/tracecontext.c
ltt/branches/poly/lttv/modules/gui/detailedevents/events.c

index e634ca57a752f7e434c6d13c11790fd15db74408..9eaec78395e32be88422873dd500dabf83bc6ade 100644 (file)
@@ -772,12 +772,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);
     
    
@@ -1544,25 +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;
-  }
-
-  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 +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);
@@ -1585,13 +1585,15 @@ guint lttv_process_traceset_seek_n_forward(LttvTracesetContext *self,
   lttv_process_traceset_begin(self, NULL, NULL, NULL, hooks, NULL);
   
   /* it will end on the end of traceset, or the fact that the
-   * hook returns 2.
+   * hook returns TRUE.
    */
   lttv_process_traceset_middle(self, ltt_time_infinite,
         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);
 
index 8b4656b9cf3bce166eb2bb6b48a9952e51455773..074a07aa110181abf8099d5df4ed921c2399b19d 100644 (file)
@@ -1188,13 +1188,27 @@ static void get_events(double new_value, EventViewerData *event_viewer_data)
     LttvTracesetContextPosition *pos =
         lttv_traceset_context_position_new(tsc);
     
-  /* Remember the beginning position */
+    /* Remember the beginning position */
     if(event_viewer_data->pos->len > 0) {
       LttvTracesetContextPosition *first_pos = 
-        (LttvTracesetContextPosition*)g_ptr_array_index(event_viewer_data->pos,
-                                                        0);
+        (LttvTracesetContextPosition*)g_ptr_array_index(
+                                                    event_viewer_data->pos,
+                                                    0);
       lttv_traceset_context_position_copy(pos, first_pos);
-      g_assert(lttv_process_traceset_seek_position(tsc, pos) == 0); 
+
+      if(relative_position > 0) {
+        LttTime first_event_time = 
+            lttv_traceset_context_position_get_time(
+                              pos);
+        lttv_state_traceset_seek_time_closest((LttvTracesetState*)tsc,
+          first_event_time);
+        lttv_process_traceset_middle(tsc, ltt_time_infinite,
+                                   G_MAXUINT,
+                                   pos);
+       
+      } else if(relative_position <= 0) {
+        g_assert(lttv_process_traceset_seek_position(tsc, pos) == 0); 
+      }
     } else {
       /* There is nothing in the list : simply seek to the time value. */
       lttv_state_traceset_seek_time_closest((LttvTracesetState*)tsc,
@@ -1423,9 +1437,10 @@ gboolean update_current_time(void * hook_data, void * call_data)
     /* Little trick : seek 0 events forward to get the first event
      * that passes the filter. The trick is to have a match function that
      * returns 2 : it makes the read stop and keep the last position */
-    guint count;
-    count = lttv_process_traceset_seek_n_forward(tsc, 0,
-          event_viewer_data->main_win_filter);
+    // We don't care : this will be taken care of by the _middle.
+    //guint count;
+    //count = lttv_process_traceset_seek_n_forward(tsc, 0,
+    //      event_viewer_data->main_win_filter);
 
 #if 0
     lttv_process_traceset_seek_time(tsc, *current_time);
This page took 0.027709 seconds and 4 git commands to generate.