X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Fmodules%2Fgui%2Fcontrolflow%2Fprocesslist.c;h=d7145924ede42a176bcbfbf11d98802899c5bdf3;hb=7b5f6cf19fe5b312dc0c5712b0fceddeed2fe11f;hp=080a92af9dc886cb66b6439bf6a7b91c3379e107;hpb=866fefbddc38ec2e13d4b18619f59961997c319f;p=lttv.git diff --git a/ltt/branches/poly/lttv/modules/gui/controlflow/processlist.c b/ltt/branches/poly/lttv/modules/gui/controlflow/processlist.c index 080a92af..d7145924 100644 --- a/ltt/branches/poly/lttv/modules/gui/controlflow/processlist.c +++ b/ltt/branches/poly/lttv/modules/gui/controlflow/processlist.c @@ -16,7 +16,12 @@ * MA 02111-1307, USA. */ +#ifdef HAVE_CONFIG_H +#include +#endif + #include +#include #include #include #include @@ -36,202 +41,70 @@ * Methods to synchronize process list * *****************************************************************************/ -//static inline 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, - N_COLUMNS -}; - gint process_sort_func ( GtkTreeModel *model, GtkTreeIter *it_a, GtkTreeIter *it_b, gpointer user_data) { - GValue a, b; + gchar *a_name; + guint a_pid, a_ppid, a_cpu; + gulong a_birth_s, a_birth_ns; + gulong a_trace; + + gchar *b_name; + guint b_pid, b_ppid, b_cpu; + gulong b_birth_s, b_birth_ns; + gulong b_trace; + + gtk_tree_model_get(model, + it_a, + 0, &a_name, + 1, &a_pid, + 2, &a_ppid, + 3, &a_cpu, + 4, &a_birth_s, + 5, &a_birth_ns, + 6, &a_trace, + -1); + + gtk_tree_model_get(model, + it_b, + 0, &b_name, + 1, &b_pid, + 2, &b_ppid, + 3, &b_cpu, + 4, &b_birth_s, + 5, &b_birth_ns, + 6, &b_trace, + -1); - memset(&a, 0, sizeof(GValue)); - memset(&b, 0, sizeof(GValue)); /* Order by PID */ - gtk_tree_model_get_value( model, - it_a, - PID_COLUMN, - &a); - - gtk_tree_model_get_value( model, - it_b, - PID_COLUMN, - &b); - - if(G_VALUE_TYPE(&a) == G_TYPE_UINT - && G_VALUE_TYPE(&b) == G_TYPE_UINT ) - { - { + if(a_pid == 0 && b_pid == 0) { + /* If 0, order by CPU */ + if(a_cpu > b_cpu) return 1; + if(a_cpu < b_cpu) return -1; - if(g_value_get_uint(&a) == 0 && g_value_get_uint(&b) == 0) { + } else { /* if not 0, order by pid */ - 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; - } - } - } + if(a_pid > b_pid) return 1; + if(a_pid < b_pid) return -1; } - g_value_unset(&a); - g_value_unset(&b); - - /* Order by birth second */ - gtk_tree_model_get_value( model, - it_a, - BIRTH_S_COLUMN, - &a); - - gtk_tree_model_get_value( model, - it_b, - BIRTH_S_COLUMN, - &b); - - - if(G_VALUE_TYPE(&a) == G_TYPE_ULONG - && G_VALUE_TYPE(&b) == G_TYPE_ULONG ) - { - if(g_value_get_ulong(&a) > g_value_get_ulong(&b)) - { - g_value_unset(&a); - g_value_unset(&b); - return 1; - } - if(g_value_get_ulong(&a) < g_value_get_ulong(&b)) - { - g_value_unset(&a); - g_value_unset(&b); - return 0; - } - } - - g_value_unset(&a); - g_value_unset(&b); + if(a_birth_s > b_birth_s) return 1; + if(a_birth_s < b_birth_s) return -1; + /* Order by birth nanosecond */ - gtk_tree_model_get_value( model, - it_a, - BIRTH_NS_COLUMN, - &a); - - gtk_tree_model_get_value( model, - it_b, - BIRTH_NS_COLUMN, - &b); - - - if(G_VALUE_TYPE(&a) == G_TYPE_ULONG - && G_VALUE_TYPE(&b) == G_TYPE_ULONG ) - { - if(g_value_get_ulong(&a) > g_value_get_ulong(&b)) - { - g_value_unset(&a); - g_value_unset(&b); - return 1; - } - if(g_value_get_ulong(&a) < g_value_get_ulong(&b)) - { - g_value_unset(&a); - g_value_unset(&b); - return 0; - } - - } + if(a_birth_ns > b_birth_ns) return 1; + if(a_birth_ns < b_birth_ns) return -1; - g_value_unset(&a); - g_value_unset(&b); - /* Order by trace_num */ - gtk_tree_model_get_value( model, - it_a, - TRACE_COLUMN, - &a); - - gtk_tree_model_get_value( model, - it_b, - TRACE_COLUMN, - &b); - - if(G_VALUE_TYPE(&a) == G_TYPE_ULONG - && G_VALUE_TYPE(&b) == G_TYPE_ULONG ) - { - if(g_value_get_ulong(&a) > g_value_get_ulong(&b)) - { - g_value_unset(&a); - g_value_unset(&b); - return 1; - } - if(g_value_get_ulong(&a) < g_value_get_ulong(&b)) - { - g_value_unset(&a); - g_value_unset(&b); - return 0; - } - - } + if(a_trace > b_trace) return 1; + if(a_trace < b_trace) return -1; return 0; @@ -253,11 +126,11 @@ static gboolean process_list_equ_fct(gconstpointer a, gconstpointer b) if(likely(pa->pid != pb->pid)) ret = FALSE; - else if(likely((pa->pid == 0 && (pa->cpu != pb->cpu)))) + if(likely((pa->pid == 0 && (pa->cpu != pb->cpu)))) ret = FALSE; - else if(unlikely(ltt_time_compare(pa->birth, pb->birth) != 0)) + if(unlikely(ltt_time_compare(pa->birth, pb->birth) != 0)) ret = FALSE; - else if(unlikely(pa->trace_num != pb->trace_num)) + if(unlikely(pa->trace_num != pb->trace_num)) ret = FALSE; return ret; @@ -268,6 +141,32 @@ void destroy_hash_key(gpointer key); void destroy_hash_data(gpointer data); +gboolean scroll_event(GtkWidget *widget, GdkEventScroll *event, gpointer data) +{ + ControlFlowData *control_flow_data = + (ControlFlowData*)g_object_get_data( + G_OBJECT(widget), + "control_flow_data"); + Drawing_t *drawing = control_flow_data->drawing; + unsigned int cell_height = + get_cell_height(GTK_TREE_VIEW(control_flow_data->process_list->process_list_widget)); + + switch(event->direction) { + case GDK_SCROLL_UP: + gtk_adjustment_set_value(control_flow_data->v_adjust, + gtk_adjustment_get_value(control_flow_data->v_adjust) - cell_height); + break; + case GDK_SCROLL_DOWN: + gtk_adjustment_set_value(control_flow_data->v_adjust, + gtk_adjustment_get_value(control_flow_data->v_adjust) + cell_height); + break; + default: + g_error("should only scroll up and down."); + } + return TRUE; +} + + static void update_index_to_pixmap_each(ProcessInfo *key, HashedProcessData *value, ProcessList *process_list) @@ -283,7 +182,7 @@ static void update_index_to_pixmap_each(ProcessInfo *key, } -static void update_index_to_pixmap(ProcessList *process_list) +void update_index_to_pixmap(ProcessList *process_list) { g_ptr_array_set_size(process_list->index_to_pixmap, g_hash_table_size(process_list->process_hash)); @@ -405,7 +304,6 @@ void copy_pixmap_to_screen(ProcessList *process_list, if(process_list->index_to_pixmap->len == 0) return; guint cell_height = process_list->cell_height; - //cell_height = 24; //FIXME /* Get indexes */ gint begin = floor(y/(double)cell_height); gint end = MIN(ceil((y+height)/(double)cell_height), @@ -416,7 +314,8 @@ void copy_pixmap_to_screen(ProcessList *process_list, g_assert(iindex_to_pixmap->len); /* Render the pixmap to the screen */ GdkPixmap *pixmap = - (GdkPixmap*)g_ptr_array_index(process_list->index_to_pixmap, i); + //(GdkPixmap*)g_ptr_array_index(process_list->index_to_pixmap, i); + GDK_PIXMAP(g_ptr_array_index(process_list->index_to_pixmap, i)); gdk_draw_drawable (dest, gc, @@ -451,6 +350,7 @@ ProcessList *processlist_construct(void) /* Create the Process list */ process_list->list_store = gtk_list_store_new ( N_COLUMNS, + G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT, @@ -463,20 +363,22 @@ ProcessList *processlist_construct(void) process_list->process_list_widget = gtk_tree_view_new_with_model (GTK_TREE_MODEL (process_list->list_store)); + g_object_unref (G_OBJECT (process_list->list_store)); - gtk_tree_sortable_set_sort_func( + gtk_tree_sortable_set_default_sort_func( GTK_TREE_SORTABLE(process_list->list_store), - PID_COLUMN, process_sort_func, NULL, NULL); - + + gtk_tree_sortable_set_sort_column_id( GTK_TREE_SORTABLE(process_list->list_store), - PID_COLUMN, + GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, GTK_SORT_ASCENDING); - + + process_list->process_hash = g_hash_table_new_full( process_list_hash_fct, process_list_equ_fct, destroy_hash_key, destroy_hash_data @@ -492,6 +394,10 @@ ProcessList *processlist_construct(void) renderer = gtk_cell_renderer_text_new (); process_list->renderer = renderer; + gint vertical_separator; + gtk_widget_style_get (GTK_WIDGET (process_list->process_list_widget), + "vertical-separator", &vertical_separator, + NULL); gtk_cell_renderer_get_size(renderer, GTK_WIDGET(process_list->process_list_widget), NULL, @@ -499,7 +405,16 @@ ProcessList *processlist_construct(void) NULL, NULL, &process_list->cell_height); - + +#if GTK_CHECK_VERSION(2,4,15) + guint ypad; + g_object_get(G_OBJECT(renderer), "ypad", &ypad, NULL); + + process_list->cell_height += ypad; +#endif + process_list->cell_height += vertical_separator; + + column = gtk_tree_view_column_new_with_attributes ( "Process", renderer, "text", @@ -511,7 +426,17 @@ ProcessList *processlist_construct(void) GTK_TREE_VIEW (process_list->process_list_widget), column); process_list->button = column->button; - + + column = gtk_tree_view_column_new_with_attributes ( "Brand", + renderer, + "text", + BRAND_COLUMN, + NULL); + gtk_tree_view_column_set_alignment (column, 0.0); + gtk_tree_view_column_set_fixed_width (column, 45); + gtk_tree_view_append_column ( + GTK_TREE_VIEW (process_list->process_list_widget), column); + column = gtk_tree_view_column_new_with_attributes ( "PID", renderer, "text", @@ -634,6 +559,34 @@ void destroy_hash_data(gpointer data) g_free(data); } + +void processlist_set_name(ProcessList *process_list, + GQuark name, + HashedProcessData *hashed_process_data) +{ + gtk_list_store_set ( process_list->list_store, &hashed_process_data->y_iter, + PROCESS_COLUMN, g_quark_to_string(name), + -1); +} + +void processlist_set_brand(ProcessList *process_list, + GQuark brand, + HashedProcessData *hashed_process_data) +{ + gtk_list_store_set ( process_list->list_store, &hashed_process_data->y_iter, + BRAND_COLUMN, g_quark_to_string(brand), + -1); +} +void processlist_set_ppid(ProcessList *process_list, + guint ppid, + HashedProcessData *hashed_process_data) +{ + gtk_list_store_set ( process_list->list_store, &hashed_process_data->y_iter, + PPID_COLUMN, ppid, + -1); +} + + int processlist_add( ProcessList *process_list, Drawing_t *drawing, guint pid, @@ -641,7 +594,8 @@ int processlist_add( ProcessList *process_list, guint ppid, LttTime *birth, guint trace_num, - const gchar *name, + GQuark name, + GQuark brand, guint *height, ProcessInfo **pm_process_info, HashedProcessData **pm_hashed_process_data) @@ -682,7 +636,8 @@ int processlist_add( ProcessList *process_list, &hashed_process_data->y_iter); gtk_list_store_set ( process_list->list_store, &hashed_process_data->y_iter, - PROCESS_COLUMN, name, + PROCESS_COLUMN, g_quark_to_string(name), + BRAND_COLUMN, g_quark_to_string(brand), PID_COLUMN, pid, PPID_COLUMN, ppid, CPU_COLUMN, cpu, @@ -702,7 +657,6 @@ int processlist_add( ProcessList *process_list, hashed_process_data->height = process_list->cell_height; - //hashed_process_data->height = 24; // FIXME g_assert(hashed_process_data->height != 0); *height = hashed_process_data->height * process_list->number_of_process;