Remove warning generated by newer gcc (4.6)
[lttv.git] / lttv / modules / gui / controlflow / eventhooks.c
index 287ddb1f425357b0331bc706e6deba18998d1f55..eb86a20f171e35958c75a2d70fde376cc566ea9d 100644 (file)
@@ -92,7 +92,6 @@ extern GSList *g_legend_list;
 static gint background_ready(void *hook_data, void *call_data)
 {
   ControlFlowData *control_flow_data = (ControlFlowData *)hook_data;
-  LttvTrace *trace = (LttvTrace*)call_data;
 
   control_flow_data->background_info_waiting--;
   
@@ -219,7 +218,6 @@ h_guicontrolflow(LttvPlugin *plugin)
 
 int event_selected_hook(void *hook_data, void *call_data)
 {
-  ControlFlowData *control_flow_data = (ControlFlowData*) hook_data;
   guint *event_number = (guint*) call_data;
 
   g_debug("DEBUG : event selected by main window : %u", *event_number);
@@ -247,6 +245,12 @@ static inline PropertiesLine prepare_s_e_line(LttvProcessState *process)
       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_MAYBE_SYSCALL)
+      prop_line.color = drawing_colors[COL_MODE_UNKNOWN];
+    else if(process->state->t == LTTV_STATE_MAYBE_USER_MODE)
+      prop_line.color = drawing_colors[COL_MODE_UNKNOWN];
+    else if(process->state->t == LTTV_STATE_MAYBE_TRAP)
+      prop_line.color = drawing_colors[COL_MODE_UNKNOWN];
     else if(process->state->t == LTTV_STATE_MODE_UNKNOWN)
       prop_line.color = drawing_colors[COL_MODE_UNKNOWN];
     else
@@ -277,6 +281,197 @@ static inline PropertiesLine prepare_s_e_line(LttvProcessState *process)
 
 }
 
+/* Before try-wake-up hook. A process is being woken; we need to draw its line up to this point in time
+   in that colour. This is basically like exec-state, but the change applies to a process other than that
+   which is currently running. */
+
+int before_trywakeup_hook(void *hook_data, void *call_data)
+{
+  LttvTraceHook *th = (LttvTraceHook*)hook_data;
+  EventsRequest *events_request = (EventsRequest*)th->hook_data;
+  ControlFlowData *control_flow_data = events_request->viewer_data;
+
+  LttvTracefileContext *tfc = (LttvTracefileContext *)call_data;
+
+  LttvTraceState *ts = (LttvTraceState *)tfc->t_context;
+
+  LttEvent *e = ltt_tracefile_get_event(tfc->tf);
+  gint target_pid_saved = tfc->target_pid;
+
+  LttTime evtime = ltt_event_time(e);
+  LttvFilter *filter = control_flow_data->filter;
+
+  guint woken_pid;
+  gint woken_cpu;
+
+  woken_pid = ltt_event_get_int(e, lttv_trace_get_hook_field(th, 0));
+  woken_cpu = ltt_event_get_unsigned(e, lttv_trace_get_hook_field(th, 1));
+  
+  tfc->target_pid = woken_pid;
+  if(!filter || !filter->head ||
+    lttv_filter_tree_parse(filter->head,e,tfc->tf,
+          tfc->t_context->t,tfc,NULL,NULL)) { 
+
+    /* First, check if the woken process is in the state computation
+     * process list. If it is there, that means we must add it right now and
+     * draw items from the beginning of the read for it. If it is not
+     * present, it's a new process and it was not present : it will
+     * be added after the state update. TOCHECK: What does that last para mean? */
+    guint trace_num = ts->parent.index;
+    LttvProcessState *process = lttv_state_find_process(ts, woken_cpu, woken_pid);
+    
+    if(process != NULL) {
+      /* Well, the woken process existed : we must get it in the process hash
+       * or add it, and draw its items.
+       */
+       /* Add process to process list (if not present) */
+      guint pl_height = 0;
+      HashedProcessData *hashed_process_data = NULL;
+      ProcessList *process_list = control_flow_data->process_list;
+      LttTime birth = process->creation_time;
+      
+      hashed_process_data = processlist_get_process_data(process_list,
+              woken_pid,
+              process->cpu,
+              &birth,
+              trace_num);
+      if(hashed_process_data == NULL)
+      {
+        g_assert(woken_pid != process->ppid);
+        /* Process not present */
+        ProcessInfo *process_info;
+        Drawing_t *drawing = control_flow_data->drawing;
+        processlist_add(process_list,
+            drawing,
+            woken_pid,
+            process->tgid,
+            process->cpu,
+            process->ppid,
+            &birth,
+            trace_num,
+            process->name,
+            process->brand,
+            &pl_height,
+            &process_info,
+            &hashed_process_data);
+        gtk_widget_set_size_request(drawing->drawing_area,
+                                    -1,
+                                    pl_height);
+        gtk_widget_queue_draw(drawing->drawing_area);
+
+      }
+  
+      /* Now, the process is in the state hash and our own process hash.
+       * We definitely can draw the items related to the ending state.
+       */
+      
+      if(ltt_time_compare(hashed_process_data->next_good_time,
+                          evtime) > 0)
+      {
+        if(hashed_process_data->x.middle_marked == FALSE) {
+    
+          TimeWindow time_window = 
+            lttvwindow_get_time_window(control_flow_data->tab);
+#ifdef EXTRA_CHECK
+          if(ltt_time_compare(evtime, time_window.start_time) == -1
+                || ltt_time_compare(evtime, time_window.end_time) == 1)
+                    return FALSE;
+#endif //EXTRA_CHECK
+          Drawing_t *drawing = control_flow_data->drawing;
+          guint width = drawing->width;
+          guint x;
+          convert_time_to_pixels(
+                    time_window,
+                    evtime,
+                    width,
+                    &x);
+
+          /* Draw collision indicator */
+          gdk_gc_set_foreground(drawing->gc, &drawing_colors[COL_WHITE]);
+          gdk_draw_point(hashed_process_data->pixmap,
+                         drawing->gc,
+                         x,
+                         COLLISION_POSITION(hashed_process_data->height));
+          hashed_process_data->x.middle_marked = TRUE;
+        }
+      } else {
+        TimeWindow time_window = 
+          lttvwindow_get_time_window(control_flow_data->tab);
+#ifdef EXTRA_CHECK
+        if(ltt_time_compare(evtime, time_window.start_time) == -1
+              || ltt_time_compare(evtime, time_window.end_time) == 1)
+                  return FALSE;
+#endif //EXTRA_CHECK
+        Drawing_t *drawing = control_flow_data->drawing;
+        guint width = drawing->width;
+        guint x;
+        convert_time_to_pixels(
+                  time_window,
+                  evtime,
+                  width,
+                  &x);
+
+
+        /* Jump over draw if we are at the same x position */
+        if(x == hashed_process_data->x.middle &&
+             hashed_process_data->x.middle_used)
+        {
+          if(hashed_process_data->x.middle_marked == FALSE) {
+            /* Draw collision indicator */
+            gdk_gc_set_foreground(drawing->gc, &drawing_colors[COL_WHITE]);
+            gdk_draw_point(hashed_process_data->pixmap,
+                           drawing->gc,
+                           x,
+                           COLLISION_POSITION(hashed_process_data->height));
+            hashed_process_data->x.middle_marked = TRUE;
+          }
+          /* jump */
+        } else {
+          DrawContext draw_context;
+
+          /* Now create the drawing context that will be used to draw
+           * items related to the last state. */
+          draw_context.drawable = hashed_process_data->pixmap;
+          draw_context.gc = drawing->gc;
+          draw_context.pango_layout = drawing->pango_layout;
+          draw_context.drawinfo.start.x = hashed_process_data->x.middle;
+          draw_context.drawinfo.end.x = x;
+
+          draw_context.drawinfo.y.over = 1;
+          draw_context.drawinfo.y.middle = (hashed_process_data->height/2);
+          draw_context.drawinfo.y.under = hashed_process_data->height;
+
+          draw_context.drawinfo.start.offset.over = 0;
+          draw_context.drawinfo.start.offset.middle = 0;
+          draw_context.drawinfo.start.offset.under = 0;
+          draw_context.drawinfo.end.offset.over = 0;
+          draw_context.drawinfo.end.offset.middle = 0;
+          draw_context.drawinfo.end.offset.under = 0;
+
+          {
+            /* Draw the line */
+            PropertiesLine prop_line = prepare_s_e_line(process);
+            draw_line((void*)&prop_line, (void*)&draw_context);
+
+          }
+          /* become the last x position */
+          hashed_process_data->x.middle = x;
+          hashed_process_data->x.middle_used = TRUE;
+          hashed_process_data->x.middle_marked = FALSE;
+
+          /* Calculate the next good time */
+          convert_pixels_to_time(width, x+1, time_window,
+                                 &hashed_process_data->next_good_time);
+        }
+      }
+    }
+  }
+
+  tfc->target_pid = target_pid_saved;
+
+  return 0;
+
+}
 
 /* before_schedchange_hook
  * 
@@ -321,11 +516,9 @@ int before_schedchange_hook(void *hook_data, void *call_data)
 
   guint pid_out;
   guint pid_in;
-  guint state_out;
   {
     pid_out = ltt_event_get_long_unsigned(e, lttv_trace_get_hook_field(th, 0));
     pid_in = ltt_event_get_long_unsigned(e, lttv_trace_get_hook_field(th, 1));
-    state_out = ltt_event_get_long_unsigned(e, lttv_trace_get_hook_field(th, 2));
   }
   
   tfc->target_pid = pid_out;
@@ -725,8 +918,6 @@ int after_schedchange_hook(void *hook_data, void *call_data)
   
   guint pid_in;
   {
-    guint pid_out;
-    pid_out = ltt_event_get_long_unsigned(e, lttv_trace_get_hook_field(th, 0));
     pid_in = ltt_event_get_long_unsigned(e, lttv_trace_get_hook_field(th, 1));
   }
 
@@ -1242,8 +1433,6 @@ int before_process_release_hook(void *hook_data, void *call_data)
 
   LttvTracefileContext *tfc = (LttvTracefileContext *)call_data;
 
-  LttvTracefileState *tfs = (LttvTracefileState *)call_data;
-
   LttvTraceState *ts = (LttvTraceState *)tfc->t_context;
 
   LttEvent *e;
@@ -1272,7 +1461,6 @@ int before_process_release_hook(void *hook_data, void *call_data)
 
   if(process != NULL) {
     LttTime birth;
-    guint pl_height = 0;
     HashedProcessData *hashed_process_data = NULL;
 
     ProcessList *process_list = control_flow_data->process_list;
@@ -1426,8 +1614,6 @@ int after_process_fork_hook(void *hook_data, void *call_data)
 
   LttvTracefileContext *tfc = (LttvTracefileContext *)call_data;
 
-  LttvTracefileState *tfs = (LttvTracefileState *)call_data;
-
   LttvTraceState *ts = (LttvTraceState *)tfc->t_context;
 
   LttEvent *e;
@@ -1843,8 +2029,6 @@ int after_event_enum_process_hook(void *hook_data, void *call_data)
 
   LttvTracefileContext *tfc = (LttvTracefileContext *)call_data;
 
-  LttvTracefileState *tfs = (LttvTracefileState *)call_data;
-
   LttvTraceState *ts = (LttvTraceState *)tfc->t_context;
 
   guint first_cpu, nb_cpus, cpu;
@@ -1858,8 +2042,6 @@ int after_event_enum_process_hook(void *hook_data, void *call_data)
           tfc->t_context->t,tfc,NULL,NULL))
       return FALSE;
 
-  LttTime evtime = ltt_event_time(e);
-
   /* Add process to process list (if not present) */
   LttvProcessState *process_in;
   LttTime birth;
@@ -1982,9 +2164,7 @@ gint update_time_window_hook(void *hook_data, void *call_data)
     /* Same scale (scrolling) */
     g_info("scrolling");
     LttTime *ns = &new_time_window->start_time;
-    LttTime *nw = &new_time_window->time_width;
     LttTime *os = &old_time_window->start_time;
-    LttTime *ow = &old_time_window->time_width;
     LttTime old_end = old_time_window->end_time;
     LttTime new_end = new_time_window->end_time;
     //if(ns<os+w<ns+w)
@@ -2247,7 +2427,6 @@ gint continue_notify(void *hook_data, void *call_data)
 gint update_current_time_hook(void *hook_data, void *call_data)
 {
   ControlFlowData *control_flow_data = (ControlFlowData*)hook_data;
-  Drawing_t *drawing = control_flow_data->drawing;
 
   LttTime current_time = *((LttTime*)call_data);
   
@@ -2398,7 +2577,6 @@ void draw_closure(gpointer key, gpointer value, gpointer user_data)
 
       /* Only draw for processes that are currently in the trace states */
 
-      ProcessList *process_list = control_flow_data->process_list;
 #ifdef EXTRA_CHECK
       /* Should be alike when background info is ready */
       if(control_flow_data->background_info_waiting==0)
@@ -2503,7 +2681,6 @@ int before_chunk(void *hook_data, void *call_data)
 {
   EventsRequest *events_request = (EventsRequest*)hook_data;
   LttvTracesetState *tss = (LttvTracesetState*)call_data;
-  ControlFlowData *cfd = (ControlFlowData*)events_request->viewer_data;
 #if 0  
   /* Desactivate sort */
   gtk_tree_sortable_set_sort_column_id(
@@ -2654,10 +2831,6 @@ int before_statedump_end(void *hook_data, void *call_data)
 
   LttvTracefileContext *tfc = (LttvTracefileContext *)call_data;
 
-  LttvTracefileState *tfs = (LttvTracefileState *)call_data;
-
-  LttvTraceState *ts = (LttvTraceState *)tfc->t_context;
-
   LttvTracesetState *tss = (LttvTracesetState*)tfc->t_context->ts_context;
   ProcessList *process_list = control_flow_data->process_list;
 
This page took 0.025864 seconds and 4 git commands to generate.