fix process end of life
[lttv.git] / ltt / branches / poly / lttv / modules / gui / controlflow / eventhooks.c
index 53d3a8834681d7a5615662bbf6bbc34c1c5ef8bb..cffd9b89b9ccc6051f82beb2172af29fe5a81122 100644 (file)
@@ -217,48 +217,6 @@ h_guicontrolflow(LttvPlugin *plugin)
   
 }
 
-void legend_destructor(GtkWindow *legend)
-{
-  g_legend_list = g_slist_remove(g_legend_list, legend);
-}
-
-/* Create a popup legend */
-GtkWidget *
-h_legend(LttvPlugin *plugin)
-{
-  LttvPluginTab *ptab = LTTV_PLUGIN_TAB(plugin);
-  Tab *tab = ptab->tab;
-  g_info("h_legend, %p", tab);
-
-  GtkWindow *legend = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL));
-  g_legend_list = g_slist_append(
-      g_legend_list,
-      legend);
-  g_object_set_data_full(
-      G_OBJECT(legend),
-      "legend",
-      legend,
-      (GDestroyNotify)legend_destructor);
-  
-  gtk_window_set_title(legend, "Control Flow View Legend");
-
-  GtkWidget *pixmap = create_pixmap(GTK_WIDGET(legend), "lttv-color-list.png");
-  
- // GtkImage *image = GTK_IMAGE(gtk_image_new_from_pixmap(
- //                               GDK_PIXMAP(pixmap), NULL));
-  
-  gtk_container_add(GTK_CONTAINER(legend), GTK_WIDGET(pixmap));
-
-  gtk_widget_show(GTK_WIDGET(pixmap));
-  gtk_widget_show(GTK_WIDGET(legend));
-  
-
-  return NULL; /* This is a popup window */
-}
-
-
 int event_selected_hook(void *hook_data, void *call_data)
 {
   ControlFlowData *control_flow_data = (ControlFlowData*) hook_data;
@@ -308,6 +266,8 @@ static inline PropertiesLine prepare_s_e_line(LttvProcessState *process)
     prop_line.color = drawing_colors[COL_EXIT];
   } else if(process->state->s == LTTV_STATE_UNNAMED) {
     prop_line.color = drawing_colors[COL_UNNAMED];
+  } else if(process->state->s == LTTV_STATE_DEAD) {
+    prop_line.color = drawing_colors[COL_DEAD];
   } else {
                g_critical("unknown state : %s", g_quark_to_string(process->state->s));
     g_assert(FALSE);   /* UNKNOWN STATE */
@@ -361,9 +321,11 @@ 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, th->f1);
-    pid_in = ltt_event_get_long_unsigned(e, th->f2);
+    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;
@@ -439,7 +401,7 @@ int before_schedchange_hook(void *hook_data, void *call_data)
 #ifdef EXTRA_CHECK
           if(ltt_time_compare(evtime, time_window.start_time) == -1
                 || ltt_time_compare(evtime, time_window.end_time) == 1)
-                    return;
+                    return FALSE;
 #endif //EXTRA_CHECK
           Drawing_t *drawing = control_flow_data->drawing;
           guint width = drawing->width;
@@ -464,7 +426,7 @@ int before_schedchange_hook(void *hook_data, void *call_data)
 #ifdef EXTRA_CHECK
         if(ltt_time_compare(evtime, time_window.start_time) == -1
               || ltt_time_compare(evtime, time_window.end_time) == 1)
-                  return;
+                  return FALSE;
 #endif //EXTRA_CHECK
         Drawing_t *drawing = control_flow_data->drawing;
         guint width = drawing->width;
@@ -603,7 +565,7 @@ int before_schedchange_hook(void *hook_data, void *call_data)
 #ifdef EXTRA_CHECK
           if(ltt_time_compare(evtime, time_window.start_time) == -1
                 || ltt_time_compare(evtime, time_window.end_time) == 1)
-                    return;
+                    return FALSE;
 #endif //EXTRA_CHECK
           Drawing_t *drawing = control_flow_data->drawing;
           guint width = drawing->width;
@@ -628,7 +590,7 @@ int before_schedchange_hook(void *hook_data, void *call_data)
 #ifdef EXTRA_CHECK
         if(ltt_time_compare(evtime, time_window.start_time) == -1
               || ltt_time_compare(evtime, time_window.end_time) == 1)
-                  return;
+                  return FALSE;
 #endif //EXTRA_CHECK
         Drawing_t *drawing = control_flow_data->drawing;
         guint width = drawing->width;
@@ -751,11 +713,6 @@ int after_schedchange_hook(void *hook_data, void *call_data)
   e = ltt_tracefile_get_event(tfc->tf);
 
   LttvFilter *filter = control_flow_data->filter;
-  if(filter != NULL && filter->head != NULL)
-    if(!lttv_filter_tree_parse(filter->head,e,tfc->tf,
-          tfc->t_context->t,tfc,NULL,NULL))
-      return FALSE;
-
   LttTime evtime = ltt_event_time(e);
 
   /* Add process to process list (if not present) */
@@ -769,83 +726,88 @@ int after_schedchange_hook(void *hook_data, void *call_data)
   guint pid_in;
   {
     guint pid_out;
-    pid_out = ltt_event_get_long_unsigned(e, th->f1);
-    pid_in = ltt_event_get_long_unsigned(e, th->f2);
+    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));
   }
 
-
-  /* Find process pid_in in the list... */
-  //process_in = lttv_state_find_process(ts, ANY_CPU, pid_in);
-  //process_in = tfs->process;
-  guint cpu = tfs->cpu;
-  guint trace_num = ts->parent.index;
-  process_in = ts->running_process[cpu];
-  /* It should exist, because we are after the state update. */
+  tfc->target_pid = pid_in;
+  if(!filter || !filter->head ||
+    lttv_filter_tree_parse(filter->head,e,tfc->tf,
+          tfc->t_context->t,tfc,NULL,NULL)) { 
+    /* Find process pid_in in the list... */
+    //process_in = lttv_state_find_process(ts, ANY_CPU, pid_in);
+    //process_in = tfs->process;
+    guint cpu = tfs->cpu;
+    guint trace_num = ts->parent.index;
+    process_in = ts->running_process[cpu];
+    /* It should exist, because we are after the state update. */
 #ifdef EXTRA_CHECK
-  g_assert(process_in != NULL);
+    g_assert(process_in != NULL);
 #endif //EXTRA_CHECK
-  birth = process_in->creation_time;
-
-  hashed_process_data_in = processlist_get_process_data(process_list,
+    birth = process_in->creation_time;
+  
+    hashed_process_data_in = processlist_get_process_data(process_list,
+            pid_in,
+            process_in->cpu,
+            &birth,
+            trace_num);
+    if(hashed_process_data_in == NULL)
+    {
+      g_assert(pid_in == 0 || pid_in != process_in->ppid);
+      ProcessInfo *process_info;
+      Drawing_t *drawing = control_flow_data->drawing;
+      /* Process not present */
+      processlist_add(process_list,
+          drawing,
           pid_in,
+          process_in->tgid,
           process_in->cpu,
+          process_in->ppid,
           &birth,
-          trace_num);
-  if(hashed_process_data_in == NULL)
-  {
-    g_assert(pid_in == 0 || pid_in != process_in->ppid);
-    ProcessInfo *process_info;
-    Drawing_t *drawing = control_flow_data->drawing;
-    /* Process not present */
-    processlist_add(process_list,
-        drawing,
-        pid_in,
-        process_in->tgid,
-        process_in->cpu,
-        process_in->ppid,
-        &birth,
-        trace_num,
-        process_in->name,
-        process_in->brand,
-        &pl_height,
-        &process_info,
-        &hashed_process_data_in);
-        gtk_widget_set_size_request(drawing->drawing_area,
-                                    -1,
-                                    pl_height);
-        gtk_widget_queue_draw(drawing->drawing_area);
-  }
-  /* Set the current process */
-  process_list->current_hash_data[trace_num][process_in->cpu] =
-                                             hashed_process_data_in;
-
-  if(ltt_time_compare(hashed_process_data_in->next_good_time,
-                          evtime) <= 0)
-  {
-    TimeWindow time_window = 
-    lttvwindow_get_time_window(control_flow_data->tab);
-
+          trace_num,
+          process_in->name,
+          process_in->brand,
+          &pl_height,
+          &process_info,
+          &hashed_process_data_in);
+          gtk_widget_set_size_request(drawing->drawing_area,
+                                      -1,
+                                      pl_height);
+          gtk_widget_queue_draw(drawing->drawing_area);
+    }
+    /* Set the current process */
+    process_list->current_hash_data[trace_num][process_in->cpu] =
+                                               hashed_process_data_in;
+  
+    if(ltt_time_compare(hashed_process_data_in->next_good_time,
+                            evtime) <= 0)
+    {
+      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;
+      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 new_x;
-    
-    convert_time_to_pixels(
-        time_window,
-        evtime,
-        width,
-        &new_x);
-
-    if(hashed_process_data_in->x.middle != new_x) {
-      hashed_process_data_in->x.middle = new_x;
-      hashed_process_data_in->x.middle_used = FALSE;
-      hashed_process_data_in->x.middle_marked = FALSE;
+      Drawing_t *drawing = control_flow_data->drawing;
+      guint width = drawing->width;
+      guint new_x;
+      
+      convert_time_to_pixels(
+          time_window,
+          evtime,
+          width,
+          &new_x);
+  
+      if(hashed_process_data_in->x.middle != new_x) {
+        hashed_process_data_in->x.middle = new_x;
+        hashed_process_data_in->x.middle_used = FALSE;
+        hashed_process_data_in->x.middle_marked = FALSE;
+      }
     }
   }
+
   return 0;
 }
 
@@ -966,7 +928,7 @@ int before_execmode_hook(void *hook_data, void *call_data)
 #ifdef EXTRA_CHECK
       if(ltt_time_compare(evtime, time_window.start_time) == -1
             || ltt_time_compare(evtime, time_window.end_time) == 1)
-                return;
+                return FALSE;
 #endif //EXTRA_CHECK
       Drawing_t *drawing = control_flow_data->drawing;
       guint width = drawing->width;
@@ -992,7 +954,7 @@ int before_execmode_hook(void *hook_data, void *call_data)
 #ifdef EXTRA_CHECK
     if(ltt_time_compare(evtime, time_window.start_time) == -1
           || ltt_time_compare(evtime, time_window.end_time) == 1)
-              return;
+              return FALSE;
 #endif //EXTRA_CHECK
     Drawing_t *drawing = control_flow_data->drawing;
     guint width = drawing->width;
@@ -1161,7 +1123,7 @@ int before_process_exit_hook(void *hook_data, void *call_data)
 #ifdef EXTRA_CHECK
       if(ltt_time_compare(evtime, time_window.start_time) == -1
             || ltt_time_compare(evtime, time_window.end_time) == 1)
-                return;
+                return FALSE;
 #endif //EXTRA_CHECK
       Drawing_t *drawing = control_flow_data->drawing;
       guint width = drawing->width;
@@ -1187,7 +1149,7 @@ int before_process_exit_hook(void *hook_data, void *call_data)
 #ifdef EXTRA_CHECK
     if(ltt_time_compare(evtime, time_window.start_time) == -1
           || ltt_time_compare(evtime, time_window.end_time) == 1)
-              return;
+              return FALSE;
 #endif //EXTRA_CHECK
     Drawing_t *drawing = control_flow_data->drawing;
     guint width = drawing->width;
@@ -1299,7 +1261,7 @@ int before_process_release_hook(void *hook_data, void *call_data)
 
   guint pid;
   {
-    pid = ltt_event_get_long_unsigned(e, th->f1);
+    pid = ltt_event_get_long_unsigned(e, lttv_trace_get_hook_field(th, 0));
   }
 
   /* Add process to process list (if not present) */
@@ -1325,29 +1287,11 @@ int before_process_release_hook(void *hook_data, void *call_data)
           &birth,
           trace_num);
     if(unlikely(hashed_process_data == NULL))
-    {
-      g_assert(pid == 0 || pid != process->ppid);
-      /* Process not present */
-      Drawing_t *drawing = control_flow_data->drawing;
-      ProcessInfo *process_info;
-      processlist_add(process_list,
-          drawing,
-          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);
-    }
+      /*
+       * Process already been scheduled out EXIT_DEAD, not in the process list
+       * anymore. Just return.
+       */
+      return FALSE;
 
     /* Now, the process is in the state hash and our own process hash.
      * We definitely can draw the items related to the ending state.
@@ -1363,7 +1307,7 @@ int before_process_release_hook(void *hook_data, void *call_data)
 #ifdef EXTRA_CHECK
         if(ltt_time_compare(evtime, time_window.start_time) == -1
               || ltt_time_compare(evtime, time_window.end_time) == 1)
-                  return;
+                  return FALSE;
 #endif //EXTRA_CHECK
         Drawing_t *drawing = control_flow_data->drawing;
         guint width = drawing->width;
@@ -1389,7 +1333,7 @@ int before_process_release_hook(void *hook_data, void *call_data)
 #ifdef EXTRA_CHECK
       if(ltt_time_compare(evtime, time_window.start_time) == -1
             || ltt_time_compare(evtime, time_window.end_time) == 1)
-                return;
+                return FALSE;
 #endif //EXTRA_CHECK
       Drawing_t *drawing = control_flow_data->drawing;
       guint width = drawing->width;
@@ -1499,7 +1443,7 @@ int after_process_fork_hook(void *hook_data, void *call_data)
 
   guint child_pid;
   {
-    child_pid = ltt_event_get_long_unsigned(e, th->f2);
+    child_pid = ltt_event_get_long_unsigned(e, lttv_trace_get_hook_field(th, 1));
   }
 
   /* Add process to process list (if not present) */
@@ -1565,7 +1509,7 @@ int after_process_fork_hook(void *hook_data, void *call_data)
 #ifdef EXTRA_CHECK
     if(ltt_time_compare(evtime, time_window.start_time) == -1
           || ltt_time_compare(evtime, time_window.end_time) == 1)
-              return;
+              return FALSE;
 #endif //EXTRA_CHECK
     Drawing_t *drawing = control_flow_data->drawing;
     guint width = drawing->width;
@@ -1592,7 +1536,7 @@ int after_process_fork_hook(void *hook_data, void *call_data)
       hashed_process_data_child->x.under_marked = FALSE;
     }
   }
-  return 0;
+  return FALSE;
 }
 
 
@@ -1696,7 +1640,7 @@ int after_process_exit_hook(void *hook_data, void *call_data)
 #ifdef EXTRA_CHECK
     if(ltt_time_compare(evtime, time_window.start_time) == -1
           || ltt_time_compare(evtime, time_window.end_time) == 1)
-              return;
+              return FALSE;
 #endif //EXTRA_CHECK
     Drawing_t *drawing = control_flow_data->drawing;
     guint width = drawing->width;
@@ -1713,7 +1657,7 @@ int after_process_exit_hook(void *hook_data, void *call_data)
     }
   }
 
-  return 0;
+  return FALSE;
 }
 
 
@@ -1927,7 +1871,7 @@ int after_event_enum_process_hook(void *hook_data, void *call_data)
   
   guint pid_in;
   {
-    pid_in = ltt_event_get_long_unsigned(e, th->f1);
+    pid_in = ltt_event_get_long_unsigned(e, lttv_trace_get_hook_field(th, 0));
   }
   
   if(pid_in == 0) {
This page took 0.029068 seconds and 4 git commands to generate.