current time set_time_window if necessary
[lttv.git] / ltt / branches / poly / lttv / modules / guiEvents.c
index 051147e75fb12933aa5ae9c1b74784231cef6dfa..490e9175378cfc666c6b8e6b06e70117966cb40b 100644 (file)
@@ -41,6 +41,7 @@
 #include <ltt/event.h>
 #include <ltt/type.h>
 #include <ltt/trace.h>
+#include <ltt/facility.h>
 #include <string.h>
 
 //#include "mw_api.h"
@@ -64,8 +65,10 @@ typedef struct _RawTraceData{
   LttEventPosition *ep;
 } RawTraceData;
 
-#define RESERVE_BIG_SIZE      1000
-#define RESERVE_SMALL_SIZE    100
+#define RESERVE_BIG_SIZE             1000
+#define RESERVE_SMALL_SIZE           100
+#define RESERVE_SMALL_SIZE_SQUARE    RESERVE_SMALL_SIZE*RESERVE_SMALL_SIZE
+#define RESERVE_SMALL_SIZE_CUBE      RESERVE_SMALL_SIZE*RESERVE_SMALL_SIZE_SQUARE
 
 typedef enum _ScrollDirection{
   SCROLL_STEP_UP,
@@ -93,6 +96,7 @@ typedef struct _EventViewerData {
   unsigned     end_event_index;          //the last event shown in the window
   unsigned     size;                     //maxi number of events loaded when instance the viewer
   gboolean     shown;                    //indicate if event detail is shown or not
+  gboolean     current_time_updated;
   char *       filter_key;
 
   //scroll window containing Tree View
@@ -405,7 +409,9 @@ gui_events(MainWindow *parent_window, LttvTracesetSelector * s,char* key )
   /* Create vertical scrollbar and pack it */
   event_viewer_data->vscroll_vc = gtk_vscrollbar_new(NULL);
   gtk_range_set_update_policy (GTK_RANGE(event_viewer_data->vscroll_vc),
-                              GTK_UPDATE_DISCONTINUOUS);
+                              GTK_UPDATE_CONTINUOUS);
+                                                // Changed by MD : more user friendly :)
+                              //GTK_UPDATE_DISCONTINUOUS);
   gtk_box_pack_start(GTK_BOX(event_viewer_data->hbox_v), event_viewer_data->vscroll_vc, FALSE, TRUE, 0);
   
   /* Get the vertical scrollbar's adjustment */
@@ -454,6 +460,7 @@ gui_events(MainWindow *parent_window, LttvTracesetSelector * s,char* key )
   //  tree_v_set_cursor(event_viewer_data);
 
   event_viewer_data->shown = FALSE;
+  event_viewer_data->current_time_updated = FALSE;
   event_viewer_data->size  = RESERVE_SMALL_SIZE;
   g_object_set_data(
                    G_OBJECT(event_viewer_data->hbox_v),
@@ -677,7 +684,7 @@ void tree_v_cursor_changed_cb (GtkWidget *widget, gpointer data)
   /* On cursor change, modify the currently selected event by calling
    * the right API function */
   tree_v_get_cursor(event_viewer_data);
-/*  
+  
   gtk_tree_view_get_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v), &path, NULL);
   if(gtk_tree_model_get_iter(model,&iter,path)){
     gtk_tree_model_get(model, &iter, TIME_COLUMN, &time, -1);
@@ -685,12 +692,14 @@ void tree_v_cursor_changed_cb (GtkWidget *widget, gpointer data)
     ltt_time.tv_nsec = time % NANOSECONDS_PER_SECOND;
  
     if(ltt_time.tv_sec != event_viewer_data->current_time.tv_sec ||
-       ltt_time.tv_nsec != event_viewer_data->current_time.tv_nsec)
+       ltt_time.tv_nsec != event_viewer_data->current_time.tv_nsec){
+      event_viewer_data->current_time_updated = TRUE;
       set_current_time(event_viewer_data->mw,&ltt_time);
+    }
   }else{
     g_warning("Can not get iter\n");
   }
-*/
+
 }
 
 
@@ -799,6 +808,35 @@ gboolean show_event_detail(void * hook_data, void * call_data)
   return FALSE;
 }
 
+void insert_data_into_model(EventViewerData *event_viewer_data, int start, int end)
+{
+  int i;
+  guint64 real_data;
+  RawTraceData * raw_data;
+  GList * first;
+  GtkTreeIter iter;
+
+  first = event_viewer_data->raw_trace_data_queue->head;
+  for(i=start; i<end; i++){
+    if(i>=event_viewer_data->number_of_events) break;    
+    raw_data = (RawTraceData*)g_list_nth_data(first, i);
+    
+    // Add a new row to the model 
+    real_data = raw_data->time.tv_sec;
+    real_data *= NANOSECONDS_PER_SECOND;
+    real_data += raw_data->time.tv_nsec;
+    gtk_list_store_append (event_viewer_data->store_m, &iter);
+    gtk_list_store_set (event_viewer_data->store_m, &iter,
+                       CPUID_COLUMN, raw_data->cpu_id,
+                       EVENT_COLUMN, raw_data->event_name,
+                       TIME_COLUMN, real_data,
+                       PID_COLUMN, raw_data->pid,
+                       ENTRY_LEN_COLUMN, raw_data->entry_length,
+                       EVENT_DESCR_COLUMN, raw_data->event_description,
+                       -1);
+  }
+}
+
 void get_test_data(double time_value, guint list_height, 
                   EventViewerData *event_viewer_data)
 {
@@ -875,7 +913,7 @@ void get_test_data(double time_value, guint list_height,
                ltt_tracefile_seek_position(tf, raw_data->ep);
                ev = ltt_tracefile_read(tf);
                start = ltt_event_time(ev);
-               maxNum = G_MAXULONG;
+               maxNum = RESERVE_SMALL_SIZE_CUBE;
              }else{
                if(block_num > 1){
                  ltt_event_position_set(raw_data->ep, block_num-1, 1);
@@ -886,7 +924,7 @@ void get_test_data(double time_value, guint list_height,
                  start.tv_sec  = 0;
                  start.tv_nsec = 0;            
                }
-               maxNum = G_MAXULONG;
+               maxNum = RESERVE_SMALL_SIZE_CUBE;
              }
            }else{
              if(block_num > count){
@@ -898,7 +936,7 @@ void get_test_data(double time_value, guint list_height,
                start.tv_sec  = 0;
                start.tv_nsec = 0;              
              }       
-             maxNum = G_MAXULONG;
+             maxNum = RESERVE_SMALL_SIZE_CUBE;
            }
 
            event_viewer_data->current_event_index = event_viewer_data->start_event_index;
@@ -931,12 +969,20 @@ void get_test_data(double time_value, guint list_height,
          end.tv_sec = G_MAXULONG;
          end.tv_nsec = G_MAXULONG;
          get_events(event_viewer_data, start, end, RESERVE_SMALL_SIZE, &size);
-       }else size = 1;
-       if(size > 0) event_number = event_viewer_data->start_event_index + 1;   
-       else         event_number = event_viewer_data->start_event_index;
+         if(size == 0){
+           get_events(event_viewer_data, start, end, RESERVE_SMALL_SIZE_SQUARE,&size);
+           if(size == 0)
+             get_events(event_viewer_data, start, end, RESERVE_SMALL_SIZE_CUBE,&size);
+         }
+         if(size==0) event_number = event_viewer_data->start_event_index;      
+         else event_number = event_viewer_data->number_of_events - size - list_height + 1;
+       }else event_number = event_viewer_data->start_event_index + 1;
        break;
       case SCROLL_PAGE_DOWN:
-       if(event_viewer_data->end_event_index >= event_viewer_data->number_of_events - 1 - list_height){
+       i = event_viewer_data->number_of_events - 1 - list_height;
+       if((gint)(event_viewer_data->end_event_index) >= i){
+         int remain_events = event_viewer_data->number_of_events - 1 
+                             -  event_viewer_data->end_event_index;
          event_viewer_data->append = TRUE;
          first = event_viewer_data->raw_trace_data_queue->head;
          if(!first)break;
@@ -946,11 +992,17 @@ void get_test_data(double time_value, guint list_height,
          end.tv_sec = G_MAXULONG;
          end.tv_nsec = G_MAXULONG;
          get_events(event_viewer_data, start, end, RESERVE_SMALL_SIZE,&size);
-       }
-       if(list_height <= event_viewer_data->number_of_events - 1 - event_viewer_data->end_event_index)
-         event_number = event_viewer_data->start_event_index + list_height - 1;        
-       else
-         event_number = event_viewer_data->number_of_events - 1 - list_height;           
+         if(size == 0){
+           get_events(event_viewer_data, start, end, RESERVE_SMALL_SIZE_SQUARE,&size);
+           if(size == 0)
+             get_events(event_viewer_data, start, end, RESERVE_SMALL_SIZE_CUBE,&size);
+         }
+         remain_events += size;
+         if(list_height <= remain_events)
+           event_number = event_viewer_data->number_of_events - remain_events - 1;     
+         else
+           event_number = event_viewer_data->number_of_events - 1 - list_height;                 
+       }else event_number = event_viewer_data->start_event_index + list_height - 1;
        break;
       case SCROLL_JUMP:
        event_viewer_data->append = TRUE;
@@ -961,7 +1013,7 @@ void get_test_data(double time_value, guint list_height,
        start = ltt_time_add(event_viewer_data->time_span.startTime, time);
        event_viewer_data->previous_value = time_value;
        get_events(event_viewer_data, start, end, RESERVE_SMALL_SIZE,&size);
-       if(size < list_height){
+       if(size < list_height && size > 0){
          event_viewer_data->append = FALSE;
          first = event_viewer_data->raw_trace_data_queue->head;
          if(!first)break;
@@ -977,12 +1029,17 @@ void get_test_data(double time_value, guint list_height,
            ltt_tracefile_seek_position(tf, raw_data->ep);
            ev = ltt_tracefile_read(tf);
            start = ltt_event_time(ev);
-           maxNum = G_MAXULONG;
+           maxNum = RESERVE_SMALL_SIZE_CUBE;
            event_viewer_data->current_event_index = 0;
            get_events(event_viewer_data, start, end, maxNum, &size);
            event_viewer_data->start_event_index = event_viewer_data->current_event_index;
          }
          event_number = event_viewer_data->raw_trace_data_queue->length - list_height;
+       }else if(size == 0){
+         get_events(event_viewer_data, start, end, RESERVE_SMALL_SIZE_SQUARE,&size);
+         if(size == 0)
+           get_events(event_viewer_data, start, end, RESERVE_SMALL_SIZE_CUBE,&size);
+         event_number = 0;
        }else{
          event_number = 0;
        }
@@ -1001,6 +1058,7 @@ void get_test_data(double time_value, guint list_height,
       first = event_viewer_data->raw_trace_data_queue->head;
       if(first){
        raw_data = (RawTraceData*)g_list_nth_data(first,event_number);
+       if(!raw_data) raw_data = (RawTraceData*)g_list_nth_data(first,0);       
        time = ltt_time_sub(raw_data->time, event_viewer_data->time_span.startTime);
        event_viewer_data->vadjust_c->value = ltt_time_to_double(time) * NANOSECONDS_PER_SECOND;
        g_signal_stop_emission_by_name(G_OBJECT(event_viewer_data->vadjust_c), "value-changed");
@@ -1011,6 +1069,9 @@ void get_test_data(double time_value, guint list_height,
 
     event_viewer_data->start_event_index = event_number;
     event_viewer_data->end_event_index = event_number + list_height - 1;    
+    if(event_viewer_data->end_event_index > event_viewer_data->number_of_events - 1){
+      event_viewer_data->end_event_index = event_viewer_data->number_of_events - 1;
+    }
 
     first = event_viewer_data->raw_trace_data_queue->head;
     gtk_list_store_clear(event_viewer_data->store_m);
@@ -1021,39 +1082,7 @@ void get_test_data(double time_value, guint list_height,
       goto LAST;
     }else gtk_widget_show(event_viewer_data->vscroll_vc);
 
-    for(i=event_number; i<event_number+list_height; i++)
-      {
-       guint64 real_data;
-
-       if(i>=event_viewer_data->number_of_events) break;
-       
-       raw_data = (RawTraceData*)g_list_nth_data(first, i);
-
-       // Add a new row to the model 
-       real_data = raw_data->time.tv_sec;
-       real_data *= NANOSECONDS_PER_SECOND;
-       real_data += raw_data->time.tv_nsec;
-       gtk_list_store_append (event_viewer_data->store_m, &iter);
-       gtk_list_store_set (event_viewer_data->store_m, &iter,
-                           CPUID_COLUMN, raw_data->cpu_id,
-                           EVENT_COLUMN, raw_data->event_name,
-                           TIME_COLUMN, real_data,
-                           PID_COLUMN, raw_data->pid,
-                           ENTRY_LEN_COLUMN, raw_data->entry_length,
-                           EVENT_DESCR_COLUMN, raw_data->event_description,
-                           -1);
-/*
-       gtk_list_store_append (event_viewer_data->store_m, &iter);
-       gtk_list_store_set (event_viewer_data->store_m, &iter,
-                           CPUID_COLUMN, 0,
-                           EVENT_COLUMN, "event irq",
-                           TIME_COLUMN, i,
-                           PID_COLUMN, 100,
-                           ENTRY_LEN_COLUMN, 17,
-                           EVENT_DESCR_COLUMN, "Detailed information",
-                           -1);
-*/
-      }
+    insert_data_into_model(event_viewer_data,event_number, event_number+list_height);
   }
 #ifdef DEBUG //do not use this, it's slower and broken
   //   } else {
@@ -1218,11 +1247,14 @@ int event_selected_hook(void *hook_data, void *call_data)
 
 }
 
-
+/* If every module uses the filter, maybe these two 
+ * (add/remove_context_hooks functions) should be put in common place
+ */
 void add_context_hooks(EventViewerData * event_viewer_data, 
                       LttvTracesetContext * tsc)
 {
-  gint i, j, nbi, nb_tracefile, nb_control, nb_per_cpu;
+  gint i, j, k, m,n, nbi, id;
+  gint nb_tracefile, nb_control, nb_per_cpu, nb_facility, nb_event;
   LttTrace *trace;
   LttvTraceContext *tc;
   LttvTracefileContext *tfc;
@@ -1230,6 +1262,9 @@ void add_context_hooks(EventViewerData * event_viewer_data,
   LttvTraceSelector     * t_s;
   LttvTracefileSelector * tf_s;
   gboolean selected;
+  LttFacility           * fac;
+  LttEventType          * et;
+  LttvEventtypeSelector * eventtype;
 
   ts_s = (LttvTracesetSelector*)g_object_get_data(G_OBJECT(event_viewer_data->hbox_v), 
                                                  event_viewer_data->filter_key);
@@ -1238,7 +1273,7 @@ void add_context_hooks(EventViewerData * event_viewer_data,
   
   nbi = lttv_traceset_number(tsc->ts);
   for(i = 0 ; i < nbi ; i++) {
-    t_s = lttv_traceset_selector_get(ts_s,i);
+    t_s = lttv_traceset_selector_trace_get(ts_s,i);
     selected = lttv_trace_selector_get_selected(t_s);
     if(!selected) continue;
     tc = tsc->traces[i];
@@ -1250,7 +1285,7 @@ void add_context_hooks(EventViewerData * event_viewer_data,
     nb_tracefile = nb_control + nb_per_cpu;
     
     for(j = 0 ; j < nb_tracefile ; j++) {
-      tf_s = lttv_trace_selector_get(t_s,j);
+      tf_s = lttv_trace_selector_tracefile_get(t_s,j);
       selected = lttv_tracefile_selector_get_selected(tf_s);
       if(!selected) continue;
       
@@ -1260,8 +1295,28 @@ void add_context_hooks(EventViewerData * event_viewer_data,
        tfc = tc->per_cpu_tracefiles[j - nb_control];
       
       //if there are hooks for tracefile, add them here
-      lttv_tracefile_context_add_hooks(tfc, NULL,NULL,NULL,NULL,
-                                      event_viewer_data->before_event_hooks,NULL);
+      //      lttv_tracefile_context_add_hooks(tfc, NULL,NULL,NULL,NULL,
+      //                                      event_viewer_data->before_event_hooks,NULL);
+
+      nb_facility = ltt_trace_facility_number(trace);
+      n = 0;
+      for(k=0;k<nb_facility;k++){
+       fac = ltt_trace_facility_get(trace,k);
+       nb_event = (int) ltt_facility_eventtype_number(fac);
+       for(m=0;m<nb_event;m++){
+         et = ltt_facility_eventtype_get(fac,m);
+         eventtype = lttv_tracefile_selector_eventtype_get(tf_s, n);
+         selected = lttv_eventtype_selector_get_selected(eventtype);
+         if(selected){
+           id = (gint) ltt_eventtype_id(et);
+           lttv_tracefile_context_add_hooks_by_id(tfc,id, 
+                                                  event_viewer_data->before_event_hooks,
+                                                  NULL);
+         }
+         n++;
+       }
+      }
+
     }
   }
   
@@ -1274,7 +1329,8 @@ void add_context_hooks(EventViewerData * event_viewer_data,
 void remove_context_hooks(EventViewerData * event_viewer_data, 
                          LttvTracesetContext * tsc)
 {
-  gint i, j, nbi, nb_tracefile, nb_control, nb_per_cpu;
+  gint i, j, k, m, nbi, n, id;
+  gint nb_tracefile, nb_control, nb_per_cpu, nb_facility, nb_event;
   LttTrace *trace;
   LttvTraceContext *tc;
   LttvTracefileContext *tfc;
@@ -1282,6 +1338,9 @@ void remove_context_hooks(EventViewerData * event_viewer_data,
   LttvTraceSelector     * t_s;
   LttvTracefileSelector * tf_s;
   gboolean selected;
+  LttFacility           * fac;
+  LttEventType          * et;
+  LttvEventtypeSelector * eventtype;
 
   ts_s = (LttvTracesetSelector*)g_object_get_data(G_OBJECT(event_viewer_data->hbox_v), 
                                                  event_viewer_data->filter_key);
@@ -1290,7 +1349,7 @@ void remove_context_hooks(EventViewerData * event_viewer_data,
   
   nbi = lttv_traceset_number(tsc->ts);
   for(i = 0 ; i < nbi ; i++) {
-    t_s = lttv_traceset_selector_get(ts_s,i);
+    t_s = lttv_traceset_selector_trace_get(ts_s,i);
     selected = lttv_trace_selector_get_selected(t_s);
     if(!selected) continue;
     tc = tsc->traces[i];
@@ -1302,7 +1361,7 @@ void remove_context_hooks(EventViewerData * event_viewer_data,
     nb_tracefile = nb_control + nb_per_cpu;
     
     for(j = 0 ; j < nb_tracefile ; j++) {
-      tf_s = lttv_trace_selector_get(t_s,j);
+      tf_s = lttv_trace_selector_tracefile_get(t_s,j);
       selected = lttv_tracefile_selector_get_selected(tf_s);
       if(!selected) continue;
       
@@ -1312,8 +1371,25 @@ void remove_context_hooks(EventViewerData * event_viewer_data,
        tfc = tc->per_cpu_tracefiles[j - nb_control];
       
       //if there are hooks for tracefile, remove them here
-      lttv_tracefile_context_remove_hooks(tfc, NULL,NULL,NULL,NULL,
-                                         event_viewer_data->before_event_hooks,NULL);
+      //      lttv_tracefile_context_remove_hooks(tfc, NULL,NULL,NULL,NULL,
+      //                                         event_viewer_data->before_event_hooks,NULL);
+
+      nb_facility = ltt_trace_facility_number(trace);
+      n = 0;
+      for(k=0;k<nb_facility;k++){
+       fac = ltt_trace_facility_get(trace,k);
+       nb_event = (int) ltt_facility_eventtype_number(fac);
+       for(m=0;m<nb_event;m++){
+         et = ltt_facility_eventtype_get(fac,m);
+         eventtype = lttv_tracefile_selector_eventtype_get(tf_s, n);
+         selected = lttv_eventtype_selector_get_selected(eventtype);
+         if(selected){
+           id = (gint) ltt_eventtype_id(et);
+           lttv_tracefile_context_remove_hooks_by_id(tfc,id); 
+         }
+         n++;
+       }
+      }
     }
   }
   //remove hooks from context
@@ -1344,16 +1420,28 @@ gboolean update_current_time(void * hook_data, void * call_data)
                   + event_viewer_data->current_time.tv_nsec;
   GtkTreeIter iter;
   guint64 time;
-  int count = 0;
+  int count = -1;
   GtkTreeModel* model = (GtkTreeModel*)event_viewer_data->store_m;
+  GList * list;
+  RawTraceData * data, *data1;
+  GtkTreePath* path;
+  char str_path[64];
+  int i, j;
+  LttTime t;
+
+  if(event_viewer_data->current_time_updated ){
+    event_viewer_data->current_time_updated = FALSE;
+    return FALSE;
+  }
 
-
+  //check if the event is shown in the current viewer
   if(gtk_tree_model_get_iter_first(model, &iter)){
     while(1){
       gtk_tree_model_get(model, &iter, TIME_COLUMN, &time, -1);
       if(time < nsec){
        if(!gtk_tree_model_iter_next(model, &iter)){
-         return TRUE;
+         count = -1;
+         break;
        }
        count++;
       }else{
@@ -1363,6 +1451,51 @@ gboolean update_current_time(void * hook_data, void * call_data)
     //    event_selected_hook(event_viewer_data, &count);
   }
 
+  //the event is not shown in the current viewer
+  if(count == -1){
+    count = 0;
+    //check if the event is in the buffer
+    list = event_viewer_data->raw_trace_data_queue->head;
+    data = (RawTraceData*)g_list_nth_data(list,0);
+    data1 = (RawTraceData*)g_list_nth_data(list,event_viewer_data->raw_trace_data_queue->length-1);
+
+    //the event is in the buffer
+    if(ltt_time_compare(data->time, event_viewer_data->current_time)<=0 &&
+       ltt_time_compare(data1->time, event_viewer_data->current_time)>=0){
+      for(i=0;i<event_viewer_data->raw_trace_data_queue->length;i++){
+       data = (RawTraceData*)g_list_nth_data(list,i);
+       if(ltt_time_compare(data->time, event_viewer_data->current_time) < 0){
+         count++;
+         continue;
+       }
+       break;
+      }
+      if(event_viewer_data->raw_trace_data_queue->length-count < event_viewer_data->num_visible_events){
+       j = event_viewer_data->raw_trace_data_queue->length - event_viewer_data->num_visible_events;
+       count -= j;
+       data = (RawTraceData*)g_list_nth_data(list,j);
+      }else{
+       j = count;
+       count = 0;
+      }
+      t = ltt_time_sub(data->time, event_viewer_data->time_span.startTime);
+      event_viewer_data->vadjust_c->value = ltt_time_to_double(t) * NANOSECONDS_PER_SECOND;
+      g_signal_stop_emission_by_name(G_OBJECT(event_viewer_data->vadjust_c), "value-changed");
+      event_viewer_data->previous_value = event_viewer_data->vadjust_c->value;
+      insert_data_into_model(event_viewer_data,j, j+event_viewer_data->num_visible_events);      
+    }else{//the event is not in the buffer
+      LttTime start = ltt_time_sub(event_viewer_data->current_time, event_viewer_data->time_span.startTime);
+      double position = ltt_time_to_double(start) * NANOSECONDS_PER_SECOND;
+      gtk_adjustment_set_value(event_viewer_data->vadjust_c, position);
+    }
+  }
+
+  sprintf(str_path,"%d\0",count);
+  path = gtk_tree_path_new_from_string (str_path);
+  gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v), path, NULL, FALSE);
+  g_signal_stop_emission_by_name(G_OBJECT(event_viewer_data->tree_v), "cursor-changed");
+  gtk_tree_path_free(path);  
+
   return FALSE;
 }
 
@@ -1395,8 +1528,12 @@ void update_raw_data_array(EventViewerData* event_viewer_data, unsigned size)
 {
   RawTraceData * data;
   if(size > 0){
-    int pid, tmpPid, i;
+    int pid, tmpPid, i,j,len;
     GList * list, *tmpList;
+    GArray * pid_array, * tmp_pid_array;
+    
+    pid_array     = g_array_sized_new(FALSE, TRUE, sizeof(int), 10);
+    tmp_pid_array = g_array_sized_new(FALSE, TRUE, sizeof(int), 10);
 
     //if the queue is full, remove some data, keep the size of the queue constant
     while(event_viewer_data->raw_trace_data_queue->length + size > RESERVE_BIG_SIZE){
@@ -1409,30 +1546,95 @@ void update_raw_data_array(EventViewerData* event_viewer_data, unsigned size)
       list    = event_viewer_data->raw_trace_data_queue->head;
       tmpList = event_viewer_data->raw_trace_data_queue_tmp->head;
       if(event_viewer_data->append){
-       data = (RawTraceData*)g_list_nth_data(list, event_viewer_data->raw_trace_data_queue->length-1);
-       pid  = data->pid;
-       data = (RawTraceData*)g_list_nth_data(tmpList, 0);
-       tmpPid = data->pid;
+       for(i= event_viewer_data->raw_trace_data_queue->length-1;i>=0;i--){
+         data = (RawTraceData*)g_list_nth_data(list,i);
+         len = data->pid==0 ? -2 : data->pid;
+         if(data->cpu_id+1 > pid_array->len){
+           pid_array = g_array_set_size(pid_array,data->cpu_id+1);         
+           pid_array = g_array_insert_val(pid_array,data->cpu_id,len);
+           pid_array = g_array_remove_index(pid_array,data->cpu_id+1);
+         }else if(data->cpu_id+1 < pid_array->len){
+           pid = g_array_index(pid_array,int,data->cpu_id);
+           if(pid == 0){
+             pid_array = g_array_insert_val(pid_array,data->cpu_id,len);
+             pid_array = g_array_remove_index(pid_array,data->cpu_id+1);
+           }
+         }       
+       }
+
+       for(i=0;i<event_viewer_data->raw_trace_data_queue_tmp->length;i++){
+         data = (RawTraceData*)g_list_nth_data(tmpList,i);
+         len = data->pid==0 ? -2 : data->pid;
+         if(data->cpu_id+1 > tmp_pid_array->len){
+           tmp_pid_array = g_array_set_size(tmp_pid_array,data->cpu_id+1);         
+           tmp_pid_array = g_array_insert_val(tmp_pid_array,data->cpu_id,len);
+           tmp_pid_array = g_array_remove_index(tmp_pid_array,data->cpu_id+1);
+         }else if(data->cpu_id+1 < tmp_pid_array->len){
+           pid = g_array_index(tmp_pid_array,int,data->cpu_id);
+           if(pid == 0){
+             tmp_pid_array = g_array_insert_val(tmp_pid_array,data->cpu_id,len);
+             tmp_pid_array = g_array_remove_index(tmp_pid_array,data->cpu_id+1);
+           }
+         }       
+       }
       }else{
-       data = (RawTraceData*)g_list_nth_data(list, 0);
-       pid  = data->pid;
-       data = (RawTraceData*)g_list_nth_data(tmpList, event_viewer_data->raw_trace_data_queue_tmp->length-1);
-       tmpPid = data->pid;
-      }
-      
-      if(pid == -1 && tmpPid != -1){
        for(i=0;i<event_viewer_data->raw_trace_data_queue->length;i++){
          data = (RawTraceData*)g_list_nth_data(list,i);
-         if(data->pid == -1) data->pid = tmpPid;
+         len = data->pid==0 ? -2 : data->pid;
+         if(data->cpu_id+1 > pid_array->len){
+           pid_array = g_array_set_size(pid_array,data->cpu_id+1);         
+           pid_array = g_array_insert_val(pid_array,data->cpu_id,len);
+           pid_array = g_array_remove_index(pid_array,data->cpu_id+1);
+         }else if(data->cpu_id+1 < pid_array->len){
+           pid = g_array_index(pid_array,int,data->cpu_id);
+           if(pid == 0){
+             pid_array = g_array_insert_val(pid_array,data->cpu_id,len);
+             pid_array = g_array_remove_index(pid_array,data->cpu_id+1);
+           }
+         }       
        }
-      }else if(pid != -1 && tmpPid == -1){
-       for(i=0;i<event_viewer_data->raw_trace_data_queue_tmp->length;i++){
+
+       for(i=event_viewer_data->raw_trace_data_queue_tmp->length-1;i>=0;i--){
          data = (RawTraceData*)g_list_nth_data(tmpList,i);
-         if(data->pid == -1) data->pid = pid;
+         len = data->pid==0 ? -2 : data->pid;
+         if(data->cpu_id+1 > tmp_pid_array->len){
+           tmp_pid_array = g_array_set_size(tmp_pid_array,data->cpu_id+1);         
+           tmp_pid_array = g_array_insert_val(tmp_pid_array,data->cpu_id,len);
+           tmp_pid_array = g_array_remove_index(tmp_pid_array,data->cpu_id+1);
+         }else if(data->cpu_id+1 < tmp_pid_array->len){
+           pid = g_array_index(tmp_pid_array,int,data->cpu_id);
+           if(pid == 0){
+             tmp_pid_array = g_array_insert_val(tmp_pid_array,data->cpu_id,len);
+             tmp_pid_array = g_array_remove_index(tmp_pid_array,data->cpu_id+1);
+           }
+         }       
+       }
+      }
+      
+      len = pid_array->len > tmp_pid_array->len ? tmp_pid_array->len : pid_array->len;
+      for(j=0;j<len;j++){
+       pid = g_array_index(pid_array,int, j);
+       tmpPid = g_array_index(tmp_pid_array,int,j);
+       if(pid == -2)pid = 0;
+       if(tmpPid == -2) tmpPid = 0;
+       
+       if(pid == -1 && tmpPid != -1){
+         for(i=0;i<event_viewer_data->raw_trace_data_queue->length;i++){
+           data = (RawTraceData*)g_list_nth_data(list,i);
+           if(data->pid == -1 && data->cpu_id == j) data->pid = tmpPid;
+         }
+       }else if(pid != -1 && tmpPid == -1){
+         for(i=0;i<event_viewer_data->raw_trace_data_queue_tmp->length;i++){
+           data = (RawTraceData*)g_list_nth_data(tmpList,i);
+           if(data->pid == -1 && data->cpu_id == j) data->pid = pid;
+         }
        }
       }
     }
 
+    g_array_free(pid_array,TRUE);
+    g_array_free(tmp_pid_array, TRUE);
+
     //add data from tmp queue into the queue
     event_viewer_data->number_of_events = event_viewer_data->raw_trace_data_queue->length 
                                         + event_viewer_data->raw_trace_data_queue_tmp->length;
@@ -1570,17 +1772,23 @@ gboolean parse_event(void *hook_data, void *call_data)
   field = ltt_event_field(e);
   time = ltt_event_time(e);
 
-  if(event_viewer_data->raw_trace_data_queue_tmp->length){ 
-    list = g_list_last(event_viewer_data->raw_trace_data_queue_tmp->head);
-    prev_raw_trace_data = (RawTraceData *)(list->data);
-  }
-
   tmp_raw_trace_data = g_new(RawTraceData,1);
   tmp_raw_trace_data->cpu_id = ltt_event_cpu_id(e);
   tmp_raw_trace_data->event_name = g_strdup(ltt_eventtype_name(ltt_event_eventtype(e)));
   tmp_raw_trace_data->time = time;
   tmp_raw_trace_data->ep = ltt_event_position_new();
 
+  if(event_viewer_data->raw_trace_data_queue_tmp->length){ 
+    list = event_viewer_data->raw_trace_data_queue_tmp->head;
+    for(i=event_viewer_data->raw_trace_data_queue_tmp->length-1;i>=0;i--){
+      data = (RawTraceData *)g_list_nth_data(list,i);
+      if(data->cpu_id == tmp_raw_trace_data->cpu_id){
+       prev_raw_trace_data = data;
+       break;
+      }
+    }    
+  }  
+
   if(prev_raw_trace_data) tmp_raw_trace_data->pid = prev_raw_trace_data->pid;
   else tmp_raw_trace_data->pid = -1;
 
@@ -1599,7 +1807,9 @@ gboolean parse_event(void *hook_data, void *call_data)
       list = event_viewer_data->raw_trace_data_queue_tmp->head;
       for(i=0;i<event_viewer_data->raw_trace_data_queue_tmp->length;i++){
        data = (RawTraceData *)g_list_nth_data(list,i);
-       data->pid = out;
+       if(data->cpu_id == tmp_raw_trace_data->cpu_id){
+         data->pid = out;
+       }
       }
     }
   }
This page took 0.03911 seconds and 4 git commands to generate.