X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Fmodules%2Fgui%2Fcontrolflow%2Fprocesslist.c;h=33c497f8e1a006d2c1f75c178b7c1068e0cd0363;hb=a2aab3a3417958dbbb2dff69c15d1206ec7d28b1;hp=60d0e1d57b9269a7c11318c2c37645b82cb6f89c;hpb=a95bc95ab4582a5c333e5ff2eb6b9327a8053f9f;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 60d0e1d5..33c497f8 100644 --- a/ltt/branches/poly/lttv/modules/gui/controlflow/processlist.c +++ b/ltt/branches/poly/lttv/modules/gui/controlflow/processlist.c @@ -32,7 +32,7 @@ * Methods to synchronize process list * *****************************************************************************/ -static guint get_cpu_number_from_name(GQuark name); +static __inline guint get_cpu_number_from_name(GQuark name); /* Enumeration of the columns */ enum @@ -233,16 +233,17 @@ gint process_sort_func ( GtkTreeModel *model, } -guint hash_fct(gconstpointer key) +static guint process_list_hash_fct(gconstpointer key) { - return ((ProcessInfo*)key)->pid; + guint pid = ((ProcessInfo*)key)->pid; + return ((pid>>8 ^ pid>>4 ^ pid>>2 ^ pid) ^ ((ProcessInfo*)key)->cpu); } -gboolean equ_fct(gconstpointer a, gconstpointer b) +static gboolean process_list_equ_fct(gconstpointer a, gconstpointer b) { const ProcessInfo *pa = (const ProcessInfo*)a; const ProcessInfo *pb = (const ProcessInfo*)b; - + if(pa->pid != pb->pid) return 0; @@ -276,6 +277,10 @@ ProcessList *processlist_construct(void) ProcessList* process_list = g_new(ProcessList,1); process_list->number_of_process = 0; + process_list->cell_height_cache = -1; + + process_list->current_process_info = NULL; + process_list->current_hash_data = NULL; /* Create the Process list */ process_list->list_store = gtk_list_store_new ( N_COLUMNS, @@ -306,7 +311,7 @@ ProcessList *processlist_construct(void) GTK_SORT_ASCENDING); process_list->process_hash = g_hash_table_new_full( - hash_fct, equ_fct, + process_list_hash_fct, process_list_equ_fct, destroy_hash_key, destroy_hash_data ); @@ -406,20 +411,17 @@ static gboolean remove_hash_item(ProcessInfo *process_info, HashedProcessData *hashed_process_data, ProcessList *process_list) { - GtkTreePath *tree_path; GtkTreeIter iter; - tree_path = gtk_tree_row_reference_get_path( - hashed_process_data->row_ref); - - gtk_tree_model_get_iter ( - GTK_TREE_MODEL(process_list->list_store), - &iter, tree_path); - - gtk_tree_path_free(tree_path); + iter = hashed_process_data->y_iter; gtk_list_store_remove (process_list->list_store, &iter); + if(process_info == process_list->current_process_info) + process_list->current_process_info = NULL; + if(hashed_process_data == process_list->current_hash_data) + process_list->current_hash_data = NULL; + return TRUE; /* remove the element from the hash table */ } @@ -441,18 +443,19 @@ GtkWidget *processlist_get_widget(ProcessList *process_list) -gint get_cell_height(GtkTreeView *tree_view) +static __inline gint get_cell_height(ProcessList *process_list, GtkTreeView *tree_view) { - gint height; - GtkTreeViewColumn *Column = gtk_tree_view_get_column(tree_view, 0); - //GList *Render_List = gtk_tree_view_column_get_cell_renderers(Column); - //GtkCellRenderer *Renderer = g_list_first(Render_List)->data; + gint height = process_list->cell_height_cache; + if(height != -1) return height; + else { + GtkTreeViewColumn *Column = gtk_tree_view_get_column(tree_view, 0); - //g_list_free(Render_List); - gtk_tree_view_column_cell_get_size(Column, NULL, NULL, NULL, NULL, &height); - //g_critical("cell 0 height : %u",height); + gtk_tree_view_column_cell_get_size(Column, NULL, NULL, NULL, NULL, + &process_list->cell_height_cache); + } + - return height; + return process_list->cell_height_cache; } void destroy_hash_key(gpointer key) @@ -473,12 +476,13 @@ int processlist_add( ProcessList *process_list, guint trace_num, const gchar *name, guint *height, + ProcessInfo **pm_process_info, HashedProcessData **pm_hashed_process_data) { - GtkTreeIter iter ; ProcessInfo *Process_Info = g_new(ProcessInfo, 1); HashedProcessData *hashed_process_data = g_new(HashedProcessData, 1); *pm_hashed_process_data = hashed_process_data; + *pm_process_info = Process_Info; Process_Info->pid = pid; if(pid == 0) @@ -495,15 +499,22 @@ 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.over_used = FALSE; + hashed_process_data->x.over_marked = FALSE; + hashed_process_data->x.middle = 0; + hashed_process_data->x.middle_used = FALSE; + hashed_process_data->x.middle_marked = FALSE; + hashed_process_data->x.under = 0; + hashed_process_data->x.under_used = FALSE; + hashed_process_data->x.under_marked = FALSE; + hashed_process_data->next_good_time = ltt_time_zero; /* 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 ( - // gtk_tree_model_get_path ( - // GTK_TREE_MODEL(process_list->list_store), - // &iter))); - gtk_list_store_set ( process_list->list_store, &iter, + gtk_list_store_append ( process_list->list_store, + &hashed_process_data->y_iter); + + gtk_list_store_set ( process_list->list_store, &hashed_process_data->y_iter, PROCESS_COLUMN, name, PID_COLUMN, pid, PPID_COLUMN, ppid, @@ -512,11 +523,13 @@ int processlist_add( ProcessList *process_list, BIRTH_NS_COLUMN, birth->tv_nsec, TRACE_COLUMN, trace_num, -1); +#if 0 hashed_process_data->row_ref = gtk_tree_row_reference_new ( GTK_TREE_MODEL(process_list->list_store), gtk_tree_model_get_path( GTK_TREE_MODEL(process_list->list_store), &iter)); +#endif //0 g_hash_table_insert(process_list->process_hash, (gpointer)Process_Info, (gpointer)hashed_process_data); @@ -527,12 +540,11 @@ int processlist_add( ProcessList *process_list, // &iter))); process_list->number_of_process++; - *height = get_cell_height(GTK_TREE_VIEW(process_list->process_list_widget)) + *height = get_cell_height(process_list, + GTK_TREE_VIEW(process_list->process_list_widget)) * process_list->number_of_process ; - return 0; - } int processlist_remove( ProcessList *process_list, @@ -541,38 +553,37 @@ int processlist_remove( ProcessList *process_list, LttTime *birth, guint trace_num) { - ProcessInfo Process_Info; + ProcessInfo process_info; gint *path_indices; HashedProcessData *hashed_process_data; GtkTreeIter iter; - Process_Info.pid = pid; - Process_Info.cpu = cpu; - Process_Info.birth = *birth; - Process_Info.trace_num = trace_num; + process_info.pid = pid; + if(pid == 0) + process_info.cpu = cpu; + else + process_info.cpu = 0; + process_info.birth = *birth; + process_info.trace_num = trace_num; if(hashed_process_data = (HashedProcessData*)g_hash_table_lookup( process_list->process_hash, - &Process_Info)) + &process_info)) { - GtkTreePath *tree_path; - - tree_path = gtk_tree_row_reference_get_path( - hashed_process_data->row_ref); - - gtk_tree_model_get_iter ( - GTK_TREE_MODEL(process_list->list_store), - &iter, tree_path); - - gtk_tree_path_free(tree_path); + iter = hashed_process_data->y_iter; gtk_list_store_remove (process_list->list_store, &iter); g_hash_table_remove(process_list->process_hash, - &Process_Info); - + &process_info); + + if(hashed_process_data == process_list->current_hash_data) { + process_list->current_process_info = NULL; + process_list->current_hash_data = NULL; + } + process_list->number_of_process--; return 0; @@ -584,38 +595,43 @@ int processlist_remove( ProcessList *process_list, guint processlist_get_height(ProcessList *process_list) { - return get_cell_height(GTK_TREE_VIEW(process_list->process_list_widget)) + return get_cell_height(process_list, + (GtkTreeView*)process_list->process_list_widget) * process_list->number_of_process ; } -gint processlist_get_process_pixels( ProcessList *process_list, +__inline gint processlist_get_process_pixels( ProcessList *process_list, guint pid, guint cpu, LttTime *birth, guint trace_num, guint *y, guint *height, HashedProcessData **pm_hashed_process_data) { - ProcessInfo Process_Info; + ProcessInfo process_info; gint *path_indices; GtkTreePath *tree_path; HashedProcessData *hashed_process_data = NULL; - Process_Info.pid = pid; - Process_Info.cpu = cpu; - Process_Info.birth = *birth; - Process_Info.trace_num = trace_num; + process_info.pid = pid; + if(pid == 0) + process_info.cpu = cpu; + else + process_info.cpu = 0; + process_info.birth = *birth; + process_info.trace_num = trace_num; if(hashed_process_data = (HashedProcessData*)g_hash_table_lookup( process_list->process_hash, - &Process_Info)) + &process_info)) { - tree_path = gtk_tree_row_reference_get_path( - hashed_process_data->row_ref); + tree_path = gtk_tree_model_get_path( + (GtkTreeModel*)process_list->list_store, + &hashed_process_data->y_iter); path_indices = gtk_tree_path_get_indices (tree_path); - *height = get_cell_height( - GTK_TREE_VIEW(process_list->process_list_widget)); + *height = get_cell_height(process_list, + (GtkTreeView*)process_list->process_list_widget); *y = *height * path_indices[0]; *pm_hashed_process_data = hashed_process_data; gtk_tree_path_free(tree_path); @@ -629,7 +645,7 @@ gint processlist_get_process_pixels( ProcessList *process_list, } -gint processlist_get_pixels_from_data( ProcessList *process_list, +__inline gint processlist_get_pixels_from_data( ProcessList *process_list, ProcessInfo *process_info, HashedProcessData *hashed_process_data, guint *y, @@ -638,12 +654,12 @@ gint processlist_get_pixels_from_data( ProcessList *process_list, gint *path_indices; GtkTreePath *tree_path; - tree_path = gtk_tree_row_reference_get_path( - hashed_process_data->row_ref); + tree_path = gtk_tree_model_get_path((GtkTreeModel*)process_list->list_store, + &hashed_process_data->y_iter); path_indices = gtk_tree_path_get_indices (tree_path); - *height = get_cell_height( - GTK_TREE_VIEW(process_list->process_list_widget)); + *height = get_cell_height(process_list, + (GtkTreeView*)process_list->process_list_widget); *y = *height * path_indices[0]; gtk_tree_path_free(tree_path); @@ -651,9 +667,8 @@ gint processlist_get_pixels_from_data( ProcessList *process_list, } -static guint get_cpu_number_from_name(GQuark name) +static __inline guint get_cpu_number_from_name(GQuark name) { - /* remember / */ const gchar *string; char *begin; guint cpu;