Enable support for opening multiple trace
[lttv.git] / lttv / modules / gui / lttvwindow / lttvwindow / callbacks.c
index a8a7ad9ed1ed3cd6b3321d9775bd0b5ee4028472..b5f416b2b909f8e4d66a18eee1cdfd111859f534 100644 (file)
@@ -38,6 +38,7 @@
 #include <lttv/module.h>
 #include <lttv/iattribute.h>
 #include <lttv/traceset.h>
+#include <lttv/state.h>
 #ifdef BABEL_CLEANUP
 #include <lttv/stats.h>
 #include <lttv/sync/sync_chain_lttv.h>
@@ -282,7 +283,7 @@ int SetTraceset(Tab * tab, LttvTraceset *traceset)
   }
 #endif /*BABEL_CLEANUP*/
 
-  time_span = lttv_traceset_get_time_span(traceset);
+  time_span = lttv_traceset_get_time_span_real(traceset);
   
   tab->traceset_info->traceset = traceset;
   
@@ -313,7 +314,46 @@ int SetTraceset(Tab * tab, LttvTraceset *traceset)
     new_time_window.end_time = ltt_time_add(new_time_window.start_time,
                                             new_time_window.time_width) ;
   }
+  lttv_state_add_event_hooks(traceset);
 
+  //TODO ybrosseau 2012-08-03 Temporarly compute checkpoints right at the adding
+  // of the traceset
+  //Compute the traceset state checkpoint 
+  {
+    
+    EventsRequest *events_request = g_new(EventsRequest, 1);
+       
+    LttvHooks *hook_adder = lttv_hooks_new();
+    lttv_hooks_add(hook_adder, lttv_state_save_hook_add_event_hooks, NULL,
+                   LTTV_PRIO_DEFAULT);
+    LttvHooks *hook_remover = lttv_hooks_new();
+    lttv_hooks_add(hook_remover, lttv_state_save_hook_remove_event_hooks,
+                  NULL, LTTV_PRIO_DEFAULT);
+      
+    // Fill the events request
+    events_request->owner = NULL;
+    events_request->viewer_data = NULL;
+    events_request->servicing = FALSE;
+    events_request->start_time = ltt_time_zero;
+    events_request->start_position = NULL;
+    events_request->stop_flag = FALSE;
+    events_request->end_time = ltt_time_infinite;
+    events_request->num_events = G_MAXUINT;
+    events_request->end_position = NULL;
+    events_request->trace = 1; //fixed    /* FIXME */
+    events_request->before_chunk_traceset = NULL;
+    events_request->before_chunk_trace = NULL;
+    events_request->before_chunk_tracefile = NULL;
+    events_request->event = NULL;
+    events_request->after_chunk_tracefile = NULL;
+    events_request->after_chunk_trace = NULL;
+    events_request->after_chunk_traceset = NULL;
+    events_request->before_request = hook_adder;
+    events_request->after_request = hook_remover;
+      
+    lttvwindow_events_request(tab, events_request);
+  }
+  
   /* Finally, call the update hooks of the viewers */
   gint retval = update_traceset(tab, traceset);
 
@@ -936,8 +976,7 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
             /* - Seek to that time */
             g_debug("SEEK TIME : %lu, %lu", events_request->start_time.tv_sec,
               events_request->start_time.tv_nsec);
-            //lttv_process_traceset_seek_time(tsc, events_request->start_time);
-           lttv_process_traceset_seek_time(ts,
+           lttv_state_traceset_seek_time_closest(ts,
                                                   events_request->start_time);
 
             /* Process the traceset with only state hooks */
@@ -953,7 +992,7 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
 
 
         } else {
-          //LttTime pos_time;
+          LttTime pos_time;
          //LttvTracefileContext *tfc =
          //  lttv_traceset_context_get_current_tfc(tsc);
           /* Else, the first request in list_in is a position request */
@@ -981,22 +1020,22 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
             /* 1.2.2.1 Seek to that position */
             g_debug("SEEK POSITION");
             //lttv_process_traceset_seek_position(tsc, events_request->start_position);
-            //pos_time = lttv_traceset_position_get_time(
-            //                         events_request->start_position);
-            //
-            //lttv_state_traceset_seek_time(ts,
-            //                                      pos_time);
-           lttv_traceset_seek_to_position( events_request->start_position);
+            pos_time = lttv_traceset_position_get_time(
+                                     events_request->start_position);
+            
+            lttv_state_traceset_seek_time_closest(ts,
+                                                  pos_time);
+           //lttv_traceset_seek_to_position( events_request->start_position);
 
             /* Process the traceset with only state hooks */
 #ifdef DEBUG
             seek_count =
-
+#endif
                lttv_process_traceset_middle(ts,
                                             ltt_time_infinite,
                                             G_MAXUINT,
                                             events_request->start_position);
-#endif
+
             //g_assert(lttv_traceset_context_ctx_pos_compare(tsc,
             //             events_request->start_position) == 0);
 
@@ -1008,7 +1047,6 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
       /* 1.3 Add hooks and call before request for all list_in members */
       {
         GSList *iter = NULL;
-
         for(iter=list_in;iter!=NULL;iter=g_slist_next(iter)) {
           EventsRequest *events_request = (EventsRequest*)iter->data;
           /* 1.3.1 If !servicing */
@@ -1024,13 +1062,14 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
            */
          //TODO ybrosseau 2012-07-10: || TRUE added since we only support
          //     traceset wide requests
-          if(events_request->trace == -1 || TRUE)
+          if(events_request->trace == -1 || TRUE) {
+
             lttv_process_traceset_begin(ts,
                 events_request->before_chunk_traceset,
                 events_request->before_chunk_trace,
                 events_request->event
                 );
-          else {
+         } else {
             guint nb_trace = lttv_traceset_number(ts);
             g_assert((guint)events_request->trace < nb_trace &&
                       events_request->trace > -1);
@@ -1038,11 +1077,8 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
 
             lttv_hooks_call(events_request->before_chunk_traceset, ts);
 
-            lttv_trace_add_hooks(trace,
-                                         events_request->before_chunk_trace,
-
-                                         events_request->event
-                                         );
+            lttv_trace_add_hooks(trace, events_request->before_chunk_trace,
+                                        events_request->event);
           }
         }
       }
@@ -1078,7 +1114,6 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
 
             lttv_trace_add_hooks(trace,
                                          events_request->before_chunk_trace,
-
                                          events_request->event
                                          );
           }
@@ -1268,9 +1303,8 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
       /* 5. After process traceset middle */
 
       LttTime curTime = lttv_traceset_get_current_time(ts);
-      /* - if current context time > traceset.end time */
-      if(ltt_time_compare(curTime,
-                         lttv_traceset_get_time_span_real(ts).end_time) > 0) {
+      /* - if the iterator is not valid anymore (got to the end) */
+      if(bt_ctf_iter_read_event(ts->iter) == NULL) {
         /* - For each req in list_in */
         GSList *iter = list_in;
     
@@ -1344,15 +1378,12 @@ gboolean lttvwindow_process_pending_requests(Tab *tab)
            */
          //TODO ybrosseau 2012-07-10: || TRUE added since we only support
          //     traceset wide requests
-          if(events_request->trace == -1 || TRUE) 
+          if(events_request->trace == -1 || TRUE) {
                lttv_process_traceset_end(ts,
                                          events_request->after_chunk_traceset,
                                          events_request->after_chunk_trace,
-
                                          events_request->event);
-
-
-          else {
+         } else {
             guint nb_trace = lttv_traceset_number(ts);
             g_assert(events_request->trace < nb_trace &&
                       events_request->trace > -1);
@@ -1649,6 +1680,7 @@ void add_trace(GtkWidget * widget, gpointer user_data)
     ptab = (LttvPluginTab *)g_object_get_data(G_OBJECT(page), "Tab_Plugin");
     tab = ptab->tab;
   }
+#if 0
 //TODO fdeslauriers 2012-07-06: Remove this popup when we support multiple traces
   traceset = lttvwindow_get_traceset(tab);
   if(traceset != NULL && lttv_traceset_number(traceset) > 0){
@@ -1663,9 +1695,12 @@ void add_trace(GtkWidget * widget, gpointer user_data)
          gtk_widget_destroy(dialogue);
          return;
        }
-  
+#endif  
   /* Create a new traceset*/
-  traceset = lttv_traceset_new();
+  traceset = tab->traceset_info->traceset;
+  if(traceset == NULL) {
+    traceset = lttv_traceset_new();
+  }
   /* File open dialog management */
 #ifdef BABEL_CLEANUP
   GtkWidget *extra_live_button;
@@ -2101,11 +2136,11 @@ void save_as(GtkWidget * widget, gpointer user_data)
 
 void zoom(GtkWidget * widget, double size)
 {
-#ifdef BABEL_CLEANUP
+
   TimeInterval time_span;
   TimeWindow new_time_window;
   LttTime    current_time, time_delta;
-  LttvTracesetContext *tsc;
+  LttvTraceset *ts;
   GtkWidget * notebook = lookup_widget(widget, "MNotebook");
 
   GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
@@ -2122,8 +2157,8 @@ void zoom(GtkWidget * widget, double size)
 
   if(size == 1) return;
 
-  tsc = LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context);
-  time_span = tsc->time_span;
+  ts = lttvwindow_get_traceset(tab);
+  time_span = lttv_traceset_get_time_span_real(ts);
   new_time_window =  tab->time_window;
   current_time = tab->current_time;
   
@@ -2185,8 +2220,6 @@ void zoom(GtkWidget * widget, double size)
  } else {
    time_change_manager(tab, new_time_window);
   }
-  
-#endif /* BABEL_CLEANUP */
 }
 
 void zoom_in(GtkWidget * widget, gpointer user_data)
@@ -3291,9 +3324,8 @@ void time_change_manager               (Tab *tab,
   TimeInterval time_span;
   
   LttvTraceset *ts = tab->traceset_info->traceset;
-  time_span.start_time =ltt_time_from_uint64( lttv_traceset_get_timestamp_begin(ts));
-  time_span.end_time = ltt_time_from_uint64(lttv_traceset_get_timestamp_end(ts));
   
+  time_span = lttv_traceset_get_time_span_real(ts);
 
   LttTime start_time = new_time_window.start_time;
   LttTime end_time = new_time_window.end_time;
@@ -3387,9 +3419,9 @@ void current_position_change_manager(Tab *tab, LttvTracesetPosition *pos)
 
   LttTime new_time = lttv_traceset_position_get_time(pos);
   /* Put the context in a state coherent position */
-#ifdef BABEL_CLEANUP
-   lttv_state_traceset_seek_time_closest((LttvTracesetState*)tsc, ltt_time_zero);
-#endif /* BABEL_CLEANUP */
+
+   lttv_state_traceset_seek_time_closest(tab->traceset_info->traceset, ltt_time_zero);
+
   current_time_change_manager(tab, new_time);
   
   set_current_position(tab, pos);
@@ -3400,7 +3432,7 @@ static void on_timebar_starttime_changed(Timebar *timebar,
 {
        Tab *tab = (Tab *)user_data;
        LttvTraceset * ts =tab->traceset_info->traceset;
-       TimeInterval time_span = lttv_traceset_get_time_span(ts);
+       TimeInterval time_span = lttv_traceset_get_time_span_real(ts);
 
        TimeWindow new_time_window = tab->time_window;
        new_time_window.start_time = timebar_get_start_time(timebar);
@@ -3436,7 +3468,7 @@ static void on_timebar_endtime_changed(Timebar *timebar,
 {
        Tab *tab = (Tab *)user_data;
         LttvTraceset * ts =tab->traceset_info->traceset;
-        TimeInterval time_span = lttv_traceset_get_time_span(ts);
+        TimeInterval time_span = lttv_traceset_get_time_span_real(ts);
 
        TimeWindow new_time_window = tab->time_window;
 
@@ -3487,7 +3519,7 @@ void scroll_value_changed_cb(GtkWidget *scrollbar,
   gdouble page_size;
   
   LttvTraceset * ts = tab->traceset_info->traceset;
-  TimeInterval time_span = lttv_traceset_get_time_span(ts);
+  TimeInterval time_span = lttv_traceset_get_time_span_real(ts);
 
   time = ltt_time_add(ltt_time_from_double(value),
                       time_span.start_time);
@@ -3998,9 +4030,10 @@ void init_tab(Tab *tab, MainWindow * mw, Tab *copy_tab,
   tab->traceset_info->traceset_context =
     g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
   //add state update hooks
-  lttv_state_add_event_hooks(
-       (LttvTracesetState*)tab->traceset_info->traceset_context);
 #endif //BABEL_CLEANUP
+  lttv_state_add_event_hooks(
+       tab->traceset_info->traceset);
+
   //determine the current_time and time_window of the tab
 #if 0
   if(copy_tab != NULL){
This page took 0.027827 seconds and 4 git commands to generate.