execution mode added
[lttv.git] / ltt / branches / poly / lttv / modules / gui / controlflow / processlist.c
index bc12c7d27c65965c0f43cbccd7b93057094adb0f..4834da8f44218ec99b012793cb654bf83c5a5dbc 100644 (file)
@@ -18,6 +18,8 @@
 
 #include <gtk/gtk.h>
 #include <glib.h>
+#include <string.h>
+#include <stdlib.h>
 
 #include "processlist.h"
 #include "drawitem.h"
  *                       Methods to synchronize process list                 *
  *****************************************************************************/
 
+static guint get_cpu_number_from_name(GQuark name);
+  
 /* Enumeration of the columns */
 enum
 {
   PROCESS_COLUMN,
   PID_COLUMN,
+  PPID_COLUMN,
+  CPU_COLUMN,
   BIRTH_S_COLUMN,
   BIRTH_NS_COLUMN,
   TRACE_COLUMN,
@@ -66,17 +72,61 @@ gint process_sort_func  ( GtkTreeModel *model,
   if(G_VALUE_TYPE(&a) == G_TYPE_UINT
     && G_VALUE_TYPE(&b) == G_TYPE_UINT )
   {
-    if(g_value_get_uint(&a) > g_value_get_uint(&b))
-    {
-      g_value_unset(&a);
-      g_value_unset(&b);
-      return 1;
-    }
-    if(g_value_get_uint(&a) < g_value_get_uint(&b))
     {
-      g_value_unset(&a);
-      g_value_unset(&b);
-      return 0;
+
+      if(g_value_get_uint(&a) == 0 &&  g_value_get_uint(&b) == 0) {
+
+        GValue cpua, cpub;
+
+        memset(&cpua, 0, sizeof(GValue));
+        memset(&cpub, 0, sizeof(GValue));
+       
+        /* If 0, order by CPU */
+        gtk_tree_model_get_value( model,
+                it_a,
+                CPU_COLUMN,
+                &cpua);
+
+        gtk_tree_model_get_value( model,
+                it_b,
+                CPU_COLUMN,
+                &cpub);
+
+        if(G_VALUE_TYPE(&cpua) == G_TYPE_UINT
+          && G_VALUE_TYPE(&cpub) == G_TYPE_UINT )
+        {
+          if(g_value_get_uint(&cpua) > g_value_get_uint(&cpub))
+          {
+            g_value_unset(&cpua);
+            g_value_unset(&cpub);
+            return 1;
+          }
+          if(g_value_get_uint(&cpua) < g_value_get_uint(&cpub))
+          {
+            g_value_unset(&cpua);
+            g_value_unset(&cpub);
+            return 0;
+          }
+        }
+
+        g_value_unset(&cpua);
+        g_value_unset(&cpub);
+
+      } else { /* if not 0, order by pid */
+      
+        if(g_value_get_uint(&a) > g_value_get_uint(&b))
+        {
+          g_value_unset(&a);
+          g_value_unset(&b);
+          return 1;
+        }
+        if(g_value_get_uint(&a) < g_value_get_uint(&b))
+        {
+          g_value_unset(&a);
+          g_value_unset(&b);
+          return 0;
+        }
+      }
     }
   }
 
@@ -138,13 +188,12 @@ gint process_sort_func  ( GtkTreeModel *model,
       g_value_unset(&b);
       return 1;
     }
-    // Final condition
-    //if(g_value_get_ulong(&a) < g_value_get_ulong(&b))
-    //{
-    //  g_value_unset(&a);
-    //  g_value_unset(&b);
-    //  return 0;
-    //}
+    if(g_value_get_ulong(&a) < g_value_get_ulong(&b))
+    {
+      g_value_unset(&a);
+      g_value_unset(&b);
+      return 0;
+    }
 
   }
   
@@ -180,8 +229,6 @@ gint process_sort_func  ( GtkTreeModel *model,
 
   }
 
-
-
   return 0;
 
 }
@@ -193,18 +240,22 @@ guint hash_fct(gconstpointer key)
 
 gboolean equ_fct(gconstpointer a, gconstpointer b)
 {
-  if(((ProcessInfo*)a)->pid != ((ProcessInfo*)b)->pid)
+  const ProcessInfo *pa = (const ProcessInfo*)a;
+  const ProcessInfo *pb = (const ProcessInfo*)b;
+
+  if(pa->pid != pb->pid)
+    return 0;
+
+  if((pa->pid == 0 && (pa->cpu != pb->cpu)))
     return 0;
-//  g_critical("compare %u and %u",((ProcessInfo*)a)->pid,((ProcessInfo*)b)->pid);
-  if(((ProcessInfo*)a)->birth.tv_sec != ((ProcessInfo*)b)->birth.tv_sec)
+
+  if(pa->birth.tv_sec != pb->birth.tv_sec)
     return 0;
-//  g_critical("compare %u and %u",((ProcessInfo*)a)->birth.tv_sec,((ProcessInfo*)b)->birth.tv_sec);
 
-  if(((ProcessInfo*)a)->birth.tv_nsec != ((ProcessInfo*)b)->birth.tv_nsec)
+  if(pa->birth.tv_nsec != pb->birth.tv_nsec)
     return 0;
-//  g_critical("compare %u and %u",((ProcessInfo*)a)->birth.tv_nsec,((ProcessInfo*)b)->birth.tv_nsec);
 
-  if(((ProcessInfo*)a)->trace_num != ((ProcessInfo*)b)->trace_num)
+  if(pa->trace_num != pb->trace_num)
     return 0;
 
   return 1;
@@ -230,6 +281,8 @@ ProcessList *processlist_construct(void)
   process_list->list_store = gtk_list_store_new (  N_COLUMNS,
               G_TYPE_STRING,
               G_TYPE_UINT,
+              G_TYPE_UINT,
+              G_TYPE_UINT,
               G_TYPE_ULONG,
               G_TYPE_ULONG,
               G_TYPE_ULONG);
@@ -285,6 +338,21 @@ ProcessList *processlist_construct(void)
   gtk_tree_view_append_column (
     GTK_TREE_VIEW (process_list->process_list_widget), column);
 
+  column = gtk_tree_view_column_new_with_attributes ( "PPID",
+                renderer,
+                "text",
+                PPID_COLUMN,
+                NULL);
+  gtk_tree_view_append_column (
+    GTK_TREE_VIEW (process_list->process_list_widget), column);
+  
+  column = gtk_tree_view_column_new_with_attributes ( "CPU",
+                renderer,
+                "text",
+                CPU_COLUMN,
+                NULL);
+  gtk_tree_view_append_column (
+    GTK_TREE_VIEW (process_list->process_list_widget), column);
 
   column = gtk_tree_view_column_new_with_attributes ( "Birth sec",
                 renderer,
@@ -352,26 +420,6 @@ static gboolean remove_hash_item(ProcessInfo *process_info,
 
   gtk_list_store_remove (process_list->list_store, &iter);
 
-#if 0
-    g_free(hashed_process_data->draw_context->previous->modify_under);
-    g_free(hashed_process_data->draw_context->previous->modify_middle);
-    g_free(hashed_process_data->draw_context->previous->modify_over);
-    g_free(hashed_process_data->draw_context->previous->under);
-    g_free(hashed_process_data->draw_context->previous->middle);
-    g_free(hashed_process_data->draw_context->previous->over);
-    g_free(hashed_process_data->draw_context->previous);
-    g_free(hashed_process_data->draw_context->current->modify_under);
-    g_free(hashed_process_data->draw_context->current->modify_middle);
-    g_free(hashed_process_data->draw_context->current->modify_over);
-    g_free(hashed_process_data->draw_context->current->under);
-    g_free(hashed_process_data->draw_context->current->middle);
-    g_free(hashed_process_data->draw_context->current->over);
-    g_free(hashed_process_data->draw_context->current);
-    g_free(hashed_process_data->draw_context);
-    g_free(hashed_process_data);
-#endif //0
-
-
   return TRUE; /* remove the element from the hash table */
 }
 
@@ -419,6 +467,8 @@ void destroy_hash_data(gpointer data)
 
 int processlist_add(  ProcessList *process_list,
       guint pid,
+      guint cpu,
+      guint ppid,
       LttTime *birth,
       guint trace_num,
       const gchar *name,
@@ -431,6 +481,11 @@ int processlist_add(  ProcessList *process_list,
   *pm_hashed_process_data = hashed_process_data;
   
   Process_Info->pid = pid;
+  if(pid == 0)
+    Process_Info->cpu = cpu;
+  else
+    Process_Info->cpu = 0;
+  Process_Info->ppid = ppid;
   Process_Info->birth = *birth;
   Process_Info->trace_num = trace_num;
 
@@ -440,55 +495,10 @@ int processlist_add(  ProcessList *process_list,
    * If it is created after state update, this value (0) will be
    * overriden by the new state before anything is drawn.
    */
-  hashed_process_data->x = 0;
+  hashed_process_data->x.over = 0;
+  hashed_process_data->x.middle = 0;
+  hashed_process_data->x.under = 0;
   
-#if 0
-  hashed_process_data->draw_context = g_new(DrawContext, 1);
-  hashed_process_data->draw_context->drawable = NULL;
-  hashed_process_data->draw_context->gc = NULL;
-  hashed_process_data->draw_context->pango_layout = NULL;
-  hashed_process_data->draw_context->current = g_new(DrawInfo,1);
-  hashed_process_data->draw_context->current->over = g_new(ItemInfo,1);
-  hashed_process_data->draw_context->current->over->x = -1;
-  hashed_process_data->draw_context->current->over->y = -1;
-  hashed_process_data->draw_context->current->middle = g_new(ItemInfo,1);
-  hashed_process_data->draw_context->current->middle->x = -1;
-  hashed_process_data->draw_context->current->middle->y = -1;
-  hashed_process_data->draw_context->current->under = g_new(ItemInfo,1);
-  hashed_process_data->draw_context->current->under->x = -1;
-  hashed_process_data->draw_context->current->under->y = -1;
-  hashed_process_data->draw_context->current->modify_over = g_new(ItemInfo,1);
-  hashed_process_data->draw_context->current->modify_over->x = -1;
-  hashed_process_data->draw_context->current->modify_over->y = -1;
-  hashed_process_data->draw_context->current->modify_middle = g_new(ItemInfo,1);
-  hashed_process_data->draw_context->current->modify_middle->x = -1;
-  hashed_process_data->draw_context->current->modify_middle->y = -1;
-  hashed_process_data->draw_context->current->modify_under = g_new(ItemInfo,1);
-  hashed_process_data->draw_context->current->modify_under->x = -1;
-  hashed_process_data->draw_context->current->modify_under->y = -1;
-  hashed_process_data->draw_context->current->status = LTTV_STATE_UNNAMED;
-  hashed_process_data->draw_context->previous = g_new(DrawInfo,1);
-  hashed_process_data->draw_context->previous->over = g_new(ItemInfo,1);
-  hashed_process_data->draw_context->previous->over->x = -1;
-  hashed_process_data->draw_context->previous->over->y = -1;
-  hashed_process_data->draw_context->previous->middle = g_new(ItemInfo,1);
-  hashed_process_data->draw_context->previous->middle->x = -1;
-  hashed_process_data->draw_context->previous->middle->y = -1;
-  hashed_process_data->draw_context->previous->under = g_new(ItemInfo,1);
-  hashed_process_data->draw_context->previous->under->x = -1;
-  hashed_process_data->draw_context->previous->under->y = -1;
-  hashed_process_data->draw_context->previous->modify_over = g_new(ItemInfo,1);
-  hashed_process_data->draw_context->previous->modify_over->x = -1;
-  hashed_process_data->draw_context->previous->modify_over->y = -1;
-  hashed_process_data->draw_context->previous->modify_middle = g_new(ItemInfo,1);
-  hashed_process_data->draw_context->previous->modify_middle->x = -1;
-  hashed_process_data->draw_context->previous->modify_middle->y = -1;
-  hashed_process_data->draw_context->previous->modify_under = g_new(ItemInfo,1);
-  hashed_process_data->draw_context->previous->modify_under->x = -1;
-  hashed_process_data->draw_context->previous->modify_under->y = -1;
-  hashed_process_data->draw_context->previous->status = LTTV_STATE_UNNAMED;
-#endif //0
-
   /* Add a new row to the model */
   gtk_list_store_append ( process_list->list_store, &iter);
   //g_critical ( "iter before : %s", gtk_tree_path_to_string (
@@ -498,6 +508,8 @@ int processlist_add(  ProcessList *process_list,
   gtk_list_store_set (  process_list->list_store, &iter,
         PROCESS_COLUMN, name,
         PID_COLUMN, pid,
+        PPID_COLUMN, ppid,
+        CPU_COLUMN, get_cpu_number_from_name(cpu),
         BIRTH_S_COLUMN, birth->tv_sec,
         BIRTH_NS_COLUMN, birth->tv_nsec,
         TRACE_COLUMN, trace_num,
@@ -507,7 +519,7 @@ int processlist_add(  ProcessList *process_list,
       gtk_tree_model_get_path(
         GTK_TREE_MODEL(process_list->list_store),
         &iter));
-  g_hash_table_insert(  process_list->process_hash,
+  g_hash_table_insert(process_list->process_hash,
         (gpointer)Process_Info,
         (gpointer)hashed_process_data);
   
@@ -527,6 +539,7 @@ int processlist_add(  ProcessList *process_list,
 
 int processlist_remove( ProcessList *process_list,
       guint pid,
+      guint cpu,
       LttTime *birth,
       guint trace_num)
 {
@@ -536,6 +549,7 @@ int processlist_remove( ProcessList *process_list,
   GtkTreeIter iter;
   
   Process_Info.pid = pid;
+  Process_Info.cpu = cpu;
   Process_Info.birth = *birth;
   Process_Info.trace_num = trace_num;
 
@@ -557,24 +571,7 @@ int processlist_remove( ProcessList *process_list,
     gtk_tree_path_free(tree_path);
 
     gtk_list_store_remove (process_list->list_store, &iter);
-#if 0
-    g_free(hashed_process_data->draw_context->previous->modify_under);
-    g_free(hashed_process_data->draw_context->previous->modify_middle);
-    g_free(hashed_process_data->draw_context->previous->modify_over);
-    g_free(hashed_process_data->draw_context->previous->under);
-    g_free(hashed_process_data->draw_context->previous->middle);
-    g_free(hashed_process_data->draw_context->previous->over);
-    g_free(hashed_process_data->draw_context->previous);
-    g_free(hashed_process_data->draw_context->current->modify_under);
-    g_free(hashed_process_data->draw_context->current->modify_middle);
-    g_free(hashed_process_data->draw_context->current->modify_over);
-    g_free(hashed_process_data->draw_context->current->under);
-    g_free(hashed_process_data->draw_context->current->middle);
-    g_free(hashed_process_data->draw_context->current->over);
-    g_free(hashed_process_data->draw_context->current);
-    g_free(hashed_process_data->draw_context);
-    g_free(hashed_process_data);
-#endif //0
+    
     g_hash_table_remove(process_list->process_hash,
         &Process_Info);
     
@@ -595,7 +592,7 @@ guint processlist_get_height(ProcessList *process_list)
 
 
 gint processlist_get_process_pixels(  ProcessList *process_list,
-          guint pid, LttTime *birth, guint trace_num,
+          guint pid, guint cpu, LttTime *birth, guint trace_num,
           guint *y,
           guint *height,
           HashedProcessData **pm_hashed_process_data)
@@ -606,6 +603,7 @@ gint processlist_get_process_pixels(  ProcessList *process_list,
   HashedProcessData *hashed_process_data = NULL;
 
   Process_Info.pid = pid;
+  Process_Info.cpu = cpu;
   Process_Info.birth = *birth;
   Process_Info.trace_num = trace_num;
 
@@ -654,3 +652,23 @@ gint processlist_get_pixels_from_data(  ProcessList *process_list,
   return 0; 
 
 }
+
+static guint get_cpu_number_from_name(GQuark name)
+{
+  /* remember / */
+  const gchar *string;
+  char *begin;
+  guint cpu;
+
+  string = g_quark_to_string(name);
+
+  begin = strrchr(string, '/');
+  begin++;
+
+  g_assert(begin != '\0');
+
+  cpu = strtoul(begin, NULL, 10);
+
+  return cpu;
+}
+
This page took 0.054632 seconds and 4 git commands to generate.