saved state fixes
[lttv.git] / ltt / branches / poly / lttv / lttv / tracecontext.c
index b66f44f5340c46a0c0254c9a65ac75e45bda6cb1..406431261da4f8f14c929f6e71fa97ad9ed8ee39 100644 (file)
@@ -45,13 +45,14 @@ gint compare_tracefile(gconstpointer a, gconstpointer b)
 }
 
 struct _LttvTraceContextPosition {
-  LttEventPosition **tf_pos;          /* Position in each trace           */
+  LttEventPosition **tf_pos;         /* Position in each tracefile       */
   guint nb_tracefile;                /* Number of tracefiles (check)     */
 };
 
 struct _LttvTracesetContextPosition {
-  LttvTraceContextPosition *t_pos;    /* Position in each trace           */
+  LttvTraceContextPosition *t_pos;    /* Position in each trace          */
   guint nb_trace;                    /* Number of traces (check)         */
+  LttTime timestamp;                 /* Current time at the saved position */
 };
 
 void lttv_context_init(LttvTracesetContext *self, LttvTraceset *ts)
@@ -188,10 +189,10 @@ init(LttvTracesetContext *self, LttvTraceset *ts)
       tfc->a = g_object_new(LTTV_ATTRIBUTE_TYPE, NULL);
     }
   }
+  self->pqueue = g_tree_new(compare_tracefile);
   lttv_process_traceset_seek_time(self, null_time);
   lttv_traceset_context_compute_time_span(self, &self->time_span);
 
-  self->pqueue = g_tree_new(compare_tracefile);
 }
 
 
@@ -637,8 +638,8 @@ guint lttv_process_traceset_middle(LttvTracesetContext *self,
 
     if(last_ret == TRUE ||
        count >= nb_events ||
-       lttv_traceset_context_ctx_pos_compare(self,
-                                             end_position) >= 0 ||
+     ((end_position==NULL)?FALSE:(lttv_traceset_context_ctx_pos_compare(self,
+                                                          end_position) >= 0))||
        ltt_time_compare(tfc->timestamp, end) >= 0)
     {
       return count;
@@ -848,6 +849,12 @@ lttv_trace_find_hook(LttTrace *t, char *facility, char *event_type,
 }
 
 
+LttvTracesetContextPosition *ltt_traceset_context_position_new()
+{
+  return g_new(LttvTracesetContextPosition,1);
+}
+
+
 void lttv_traceset_context_position_save(const LttvTracesetContext *self,
                                     LttvTracesetContextPosition *pos)
 {
@@ -860,6 +867,8 @@ void lttv_traceset_context_position_save(const LttvTracesetContext *self,
 
   LttEvent *event;
 
+  LttTime timestamp = self->time_span.end_time;
+
   pos->nb_trace = nb_trace = lttv_traceset_number(self->ts);
   pos->t_pos = g_new(LttvTraceContextPosition, nb_trace);
   
@@ -871,14 +880,21 @@ void lttv_traceset_context_position_save(const LttvTracesetContext *self,
 
     pos->t_pos[iter_trace].tf_pos = g_new(LttEventPosition*, nb_tracefile);
     for(iter_tracefile = 0; iter_tracefile < nb_tracefile; iter_tracefile++) {
-      pos->t_pos[iter_trace].tf_pos[iter_tracefile] 
-                                                = ltt_event_position_new();
       tfc = tc->tracefiles[iter_tracefile];
       event = tfc->e;
-      ltt_event_position(event, 
-                         pos->t_pos[iter_trace].tf_pos[iter_tracefile]);
+      if(event!=NULL) {
+        pos->t_pos[iter_trace].tf_pos[iter_tracefile] 
+                                                = ltt_event_position_new();
+        ltt_event_position(event, 
+                           pos->t_pos[iter_trace].tf_pos[iter_tracefile]);
+      } else {
+        pos->t_pos[iter_trace].tf_pos[iter_tracefile] = NULL;
+      }
+      if(ltt_time_compare(tfc->timestamp, timestamp) < 0)
+        timestamp = tfc->timestamp;
     }
   }
+  pos->timestamp = timestamp;
 }
 
 void lttv_traceset_context_position_destroy(LttvTracesetContextPosition *pos)
@@ -892,8 +908,8 @@ void lttv_traceset_context_position_destroy(LttvTracesetContextPosition *pos)
     for(iter_tracefile = 0; iter_tracefile < 
                         pos->t_pos[iter_trace].nb_tracefile;
                         iter_tracefile++) {
-      
-      g_free(pos->t_pos[iter_trace].tf_pos[iter_tracefile]);
+      if(pos->t_pos[iter_trace].tf_pos[iter_tracefile] != NULL)
+        g_free(pos->t_pos[iter_trace].tf_pos[iter_tracefile]);
     }
     g_free(pos->t_pos[iter_trace].tf_pos);
   }
@@ -901,6 +917,35 @@ void lttv_traceset_context_position_destroy(LttvTracesetContextPosition *pos)
 
 }
 
+void lttv_traceset_context_position_copy(LttvTracesetContextPosition *dest,
+                                   const LttvTracesetContextPosition *src)
+{
+  guint nb_trace, nb_tracefile;
+  guint iter_trace, iter_tracefile;
+  
+  nb_trace = dest->nb_trace = src->nb_trace;
+  dest->t_pos = g_new(LttvTraceContextPosition, nb_trace);
+  for(iter_trace = 0 ; iter_trace < nb_trace ; iter_trace++) {
+
+    nb_tracefile = dest->t_pos[iter_trace].nb_tracefile =
+                    src->t_pos[iter_trace].nb_tracefile;
+
+    for(iter_tracefile = 0; iter_tracefile < nb_tracefile; iter_tracefile++) {
+      dest->t_pos[iter_trace].tf_pos[iter_tracefile] = 
+                      ltt_event_position_new();
+      if(src->t_pos[iter_trace].tf_pos[iter_tracefile] != NULL)
+        ltt_event_position_copy(
+              dest->t_pos[iter_trace].tf_pos[iter_tracefile],
+              src->t_pos[iter_trace].tf_pos[iter_tracefile]);
+      else
+        dest->t_pos[iter_trace].tf_pos[iter_tracefile] = NULL;
+    }
+  }
+
+  dest->timestamp = src->timestamp;
+}
+
 gint lttv_traceset_context_ctx_pos_compare(const LttvTracesetContext *self,
                                         const LttvTracesetContextPosition *pos)
 {
@@ -974,3 +1019,19 @@ gint lttv_traceset_context_pos_pos_compare(
 }
 
 
+LttTime lttv_traceset_context_position_get_time(
+                                  const LttvTracesetContextPosition *pos)
+{
+  return pos->timestamp;
+}
+
+
+LttvTracefileContext *lttv_traceset_context_get_current_tfc(LttvTracesetContext *self)
+{
+  GTree *pqueue = self->pqueue;
+  LttvTracefileContext *tfc = NULL;
+
+  g_tree_foreach(pqueue, get_first, &tfc);
+
+  return tfc;
+}
This page took 0.02508 seconds and 4 git commands to generate.