add softirq mode
[lttv.git] / ltt / branches / poly / lttv / modules / gui / controlflow / eventhooks.c
index 089cd5e9d17b415b37b1502cbb70c6c2f5d9ddc9..22015eafffe26e5a10d6878ff023c651847134e6 100644 (file)
@@ -88,7 +88,7 @@ extern GSList *g_legend_list;
  * Wait for all the awaited computations to be over.
  */
 
-gint background_ready(void *hook_data, void *call_data)
+static gint background_ready(void *hook_data, void *call_data)
 {
   ControlFlowData *control_flow_data = (ControlFlowData *)hook_data;
   LttvTrace *trace = (LttvTrace*)call_data;
@@ -113,7 +113,7 @@ gint background_ready(void *hook_data, void *call_data)
 /* Request background computation. Verify if it is in progress or ready first.
  * Only for each trace in the tab's traceset.
  */
-void request_background_data(ControlFlowData *control_flow_data)
+static void request_background_data(ControlFlowData *control_flow_data)
 {
   LttvTracesetContext * tsc =
         lttvwindow_get_traceset_context(control_flow_data->tab);
@@ -138,9 +138,9 @@ void request_background_data(ControlFlowData *control_flow_data)
          * information. Happens when two viewers ask for it before servicing
          * starts.
          */
-        lttvwindowtraces_background_request_remove(trace, "state");
-        lttvwindowtraces_background_request_queue(trace,
-                                                  "state");
+        if(!lttvwindowtraces_background_request_find(trace, "state"))
+          lttvwindowtraces_background_request_queue(
+              main_window_get_widget(control_flow_data->tab), trace, "state");
         lttvwindowtraces_background_notify_queue(control_flow_data,
                                                  trace,
                                                  ltt_time_infinite,
@@ -158,7 +158,7 @@ void request_background_data(ControlFlowData *control_flow_data)
       }
     } else {
       /* Data ready. Be its nature, this viewer doesn't need to have
-       * its data ready hook called htere, because a background
+       * its data ready hook called there, because a background
        * request is always linked with a redraw.
        */
     }
@@ -183,7 +183,7 @@ GtkWidget *
 h_guicontrolflow(Tab *tab)
 {
   g_info("h_guicontrolflow, %p", tab);
-  ControlFlowData *control_flow_data = guicontrolflow() ;
+  ControlFlowData *control_flow_data = guicontrolflow(tab) ;
   
   control_flow_data->tab = tab;
   
@@ -279,6 +279,8 @@ static inline PropertiesLine prepare_s_e_line(LttvProcessState *process)
       prop_line.color = drawing_colors[COL_RUN_TRAP];
     else if(process->state->t == LTTV_STATE_IRQ)
       prop_line.color = drawing_colors[COL_RUN_IRQ];
+    else if(process->state->t == LTTV_STATE_SOFT_IRQ)
+      prop_line.color = drawing_colors[COL_RUN_SOFT_IRQ];
     else if(process->state->t == LTTV_STATE_MODE_UNKNOWN)
       prop_line.color = drawing_colors[COL_MODE_UNKNOWN];
     else
@@ -534,7 +536,7 @@ int before_schedchange_hook(void *hook_data, void *call_data)
       
       hashed_process_data = processlist_get_process_data(process_list,
               pid_in,
-              process->cpu,
+              ltt_tracefile_num(tfc->tf),
               &birth,
               tfc->t_context->index);
       if(hashed_process_data == NULL)
@@ -546,7 +548,7 @@ int before_schedchange_hook(void *hook_data, void *call_data)
         processlist_add(process_list,
             drawing,
             pid_in,
-            process->cpu,
+            ltt_tracefile_num(tfc->tf),
             process->ppid,
             &birth,
             tfc->t_context->index,
@@ -668,7 +670,8 @@ int before_schedchange_hook(void *hook_data, void *call_data)
                                  &hashed_process_data->next_good_time);
         }
       }
-    }
+    } else
+      g_warning("Cannot find pin_in in schedchange %u", pid_in);
   }
   return 0;
 
@@ -1914,8 +1917,10 @@ gint update_time_window_hook(void *hook_data, void *call_data)
         control_flow_data->drawing->height);
   }
 
+  /* Update directly when scrolling */
+  gdk_window_process_updates(control_flow_data->drawing->drawing_area->window,
+      TRUE);
 
-  
   return 0;
 }
 
@@ -1924,6 +1929,12 @@ gint traceset_notify(void *hook_data, void *call_data)
   ControlFlowData *control_flow_data = (ControlFlowData*) hook_data;
   Drawing_t *drawing = control_flow_data->drawing;
 
+  if(unlikely(drawing->gc == NULL)) {
+    return FALSE;
+  }
+  if(drawing->dotted_gc == NULL) {
+    return FALSE;
+  }
 
   drawing_clear(control_flow_data->drawing);
   processlist_clear(control_flow_data->process_list);
@@ -2076,8 +2087,11 @@ gint update_current_time_hook(void *hook_data, void *call_data)
     
   }
   gtk_widget_queue_draw(control_flow_data->drawing->drawing_area);
-                             
   
+  /* Update directly when scrolling */
+  gdk_window_process_updates(control_flow_data->drawing->drawing_area->window,
+      TRUE);
+                             
   return 0;
 }
 
This page took 0.024463 seconds and 4 git commands to generate.