From ac4e21cf65c238b9d1166860707a05b447a4bc45 Mon Sep 17 00:00:00 2001 From: compudj Date: Sat, 14 Aug 2004 19:37:11 +0000 Subject: [PATCH] still some performance enhancements git-svn-id: http://ltt.polymtl.ca/svn@751 04897980-b3bd-0310-b5e0-8ef037075253 --- ltt/branches/poly/lttv/lttv/state.c | 4 + ltt/branches/poly/lttv/lttv/state.h | 1 + .../lttv/modules/gui/controlflow/eventhooks.c | 201 ++++++++++-------- .../modules/gui/controlflow/processlist.c | 34 +-- .../modules/gui/controlflow/processlist.h | 8 +- .../gui/lttvwindow/lttvwindow/lttvwindow.h | 2 +- 6 files changed, 129 insertions(+), 121 deletions(-) diff --git a/ltt/branches/poly/lttv/lttv/state.c b/ltt/branches/poly/lttv/lttv/state.c index 979bfda1..d60b4588 100644 --- a/ltt/branches/poly/lttv/lttv/state.c +++ b/ltt/branches/poly/lttv/lttv/state.c @@ -139,6 +139,7 @@ restore_init_state(LttvTraceState *self) tfcs->process = lttv_state_create_process(tfcs, NULL,0); tfcs->process->state->s = LTTV_STATE_RUN; tfcs->process->last_cpu = tfcs->cpu_name; + tfcs->process->last_cpu_index = ((LttvTracefileContext*)tfcs)->index; } } @@ -779,6 +780,7 @@ lttv_state_create_process(LttvTracefileState *tfs, LttvProcessState *parent, process->pid = pid; process->last_cpu = tfs->cpu_name; + process->last_cpu_index = ((LttvTracefileContext*)tfs)->index; g_warning("Process %u, core %p", process->pid, process); g_hash_table_insert(tcs->processes, process, process); @@ -803,6 +805,7 @@ lttv_state_create_process(LttvTracefileState *tfs, LttvProcessState *parent, process->creation_time.tv_nsec); process->pid_time = g_quark_from_string(buffer); process->last_cpu = tfs->cpu_name; + process->last_cpu_index = ((LttvTracefileContext*)tfs)->index; process->execution_stack = g_array_sized_new(FALSE, FALSE, sizeof(LttvExecutionState), PREALLOCATED_EXECUTION_STACK); g_array_set_size(process->execution_stack, 1); @@ -991,6 +994,7 @@ static gboolean schedchange(void *hook_data, void *call_data) s->process = lttv_state_find_process_or_create(s, pid_in); s->process->state->s = LTTV_STATE_RUN; s->process->last_cpu = s->cpu_name; + s->process->last_cpu_index = ((LttvTracefileContext*)s)->index; s->process->state->change = s->parent.timestamp; return FALSE; } diff --git a/ltt/branches/poly/lttv/lttv/state.h b/ltt/branches/poly/lttv/lttv/state.h index 3bae70b8..f3499937 100644 --- a/ltt/branches/poly/lttv/lttv/state.h +++ b/ltt/branches/poly/lttv/lttv/state.h @@ -150,6 +150,7 @@ typedef struct _LttvProcessState { GArray *execution_stack; /* Array of LttvExecutionState */ LttvExecutionState *state; /* Top of interrupt stack */ GQuark last_cpu; /* Last CPU where process was scheduled */ + guint last_cpu_index; /* index in the trace for cpu tracefile */ /* opened file descriptors, address map?... */ } LttvProcessState; diff --git a/ltt/branches/poly/lttv/modules/gui/controlflow/eventhooks.c b/ltt/branches/poly/lttv/modules/gui/controlflow/eventhooks.c index fc4e2caa..5761a4bb 100644 --- a/ltt/branches/poly/lttv/modules/gui/controlflow/eventhooks.c +++ b/ltt/branches/poly/lttv/modules/gui/controlflow/eventhooks.c @@ -435,14 +435,12 @@ int before_schedchange_hook(void *hook_data, void *call_data) ProcessList *process_list = control_flow_data->process_list; LttTime birth = process->creation_time; - if(processlist_get_process_pixels(process_list, + hashed_process_data = processlist_get_process_data(process_list, pid_out, process->last_cpu_index, &birth, - tfc->t_context->index, - &y, - &height, - &hashed_process_data) == 1) + tfc->t_context->index); + if(hashed_process_data == NULL) { g_assert(pid_out == 0 || pid_out != process->ppid); const gchar *name = g_quark_to_string(process->name); @@ -464,7 +462,7 @@ int before_schedchange_hook(void *hook_data, void *call_data) &height); drawing_insert_square( drawing, y, height); } - + /* Now, the process is in the state hash and our own process hash. * We definitely can draw the items related to the ending state. */ @@ -479,6 +477,11 @@ int before_schedchange_hook(void *hook_data, void *call_data) evtime) > 0) { if(hashed_process_data->x.middle_marked == FALSE) { + processlist_get_pixels_from_data(process_list, + hashed_process_data, + &y, + &height); + TimeWindow time_window = lttvwindow_get_time_window(control_flow_data->tab); #ifdef EXTRA_CHECK @@ -503,12 +506,18 @@ int before_schedchange_hook(void *hook_data, void *call_data) hashed_process_data->x.middle_marked = TRUE; } } else { - TimeWindow time_window = - lttvwindow_get_time_window(control_flow_data->tab); + processlist_get_pixels_from_data(process_list, + hashed_process_data, + &y, + &height); + + + 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; #endif //EXTRA_CHECK guint x; @@ -594,14 +603,12 @@ int before_schedchange_hook(void *hook_data, void *call_data) ProcessList *process_list = control_flow_data->process_list; LttTime birth = process->creation_time; - if(processlist_get_process_pixels(process_list, + hashed_process_data = processlist_get_process_data(process_list, pid_in, process->last_cpu_index, &birth, - tfc->t_context->index, - &y, - &height, - &hashed_process_data) == 1) + tfc->t_context->index); + if(hashed_process_data == NULL) { g_assert(pid_in == 0 || pid_in != process->ppid); const gchar *name = g_quark_to_string(process->name); @@ -641,6 +648,11 @@ int before_schedchange_hook(void *hook_data, void *call_data) evtime) > 0) { if(hashed_process_data->x.middle_marked == FALSE) { + + processlist_get_pixels_from_data(process_list, + hashed_process_data, + &y, + &height); TimeWindow time_window = lttvwindow_get_time_window(control_flow_data->tab); #ifdef EXTRA_CHECK @@ -664,6 +676,10 @@ int before_schedchange_hook(void *hook_data, void *call_data) hashed_process_data->x.middle_marked = TRUE; } } else { + processlist_get_pixels_from_data(process_list, + hashed_process_data, + &y, + &height); TimeWindow time_window = lttvwindow_get_time_window(control_flow_data->tab); #ifdef EXTRA_CHECK @@ -1403,14 +1419,12 @@ int after_schedchange_hook(void *hook_data, void *call_data) birth = process_in->creation_time; - if(processlist_get_process_pixels(process_list, + hashed_process_data_in = processlist_get_process_data(process_list, pid_in, process_in->last_cpu_index, &birth, - tfc->t_context->index, - &y_in, - &height, - &hashed_process_data_in) == 1) + tfc->t_context->index); + if(hashed_process_data_in == NULL) { g_assert(pid_in == 0 || pid_in != process_in->ppid); const gchar *name = g_quark_to_string(process_in->name); @@ -1439,6 +1453,10 @@ int after_schedchange_hook(void *hook_data, void *call_data) if(ltt_time_compare(hashed_process_data_in->next_good_time, evtime) <= 0) { + processlist_get_pixels_from_data(process_list, + hashed_process_data_in, + &y_in, + &height); TimeWindow time_window = lttvwindow_get_time_window(control_flow_data->tab); @@ -2008,19 +2026,13 @@ int before_execmode_hook(void *hook_data, void *call_data) if(process_list->current_hash_data[tfc->index] != NULL) { hashed_process_data = process_list->current_hash_data[tfc->index]; - processlist_get_pixels_from_data(process_list, - hashed_process_data, - &y, - &height); } else { - if(processlist_get_process_pixels(process_list, + hashed_process_data = processlist_get_process_data(process_list, pid, process->last_cpu_index, &birth, - tfc->t_context->index, - &y, - &height, - &hashed_process_data) == 1) + tfc->t_context->index); + if(hashed_process_data == NULL) { g_assert(pid == 0 || pid != process->ppid); ProcessInfo *process_info; @@ -2062,6 +2074,10 @@ int before_execmode_hook(void *hook_data, void *call_data) evtime) > 0) { if(hashed_process_data->x.middle_marked == FALSE) { + processlist_get_pixels_from_data(process_list, + hashed_process_data, + &y, + &height); TimeWindow time_window = lttvwindow_get_time_window(control_flow_data->tab); @@ -2086,6 +2102,10 @@ int before_execmode_hook(void *hook_data, void *call_data) hashed_process_data->x.middle_marked = TRUE; } } else { + processlist_get_pixels_from_data(process_list, + hashed_process_data, + &y, + &height); TimeWindow time_window = lttvwindow_get_time_window(control_flow_data->tab); @@ -2204,19 +2224,13 @@ int after_execmode_hook(void *hook_data, void *call_data) if(process_list->current_hash_data[tfc->index] != NULL) { hashed_process_data = process_list->current_hash_data[tfc->index]; - processlist_get_pixels_from_data(process_list, - hashed_process_data, - &y, - &height); } else { - if(processlist_get_process_pixels(process_list, + hashed_process_data = processlist_get_process_data(process_list, pid, process->last_cpu_index, &birth, - tfc->t_context->index, - &y, - &height, - &hashed_process_data) == 1) + tfc->t_context->index); + if(hashed_process_data == NULL) { g_assert(pid == 0 || pid != process->ppid); /* Process not present */ @@ -2246,6 +2260,12 @@ int after_execmode_hook(void *hook_data, void *call_data) if(ltt_time_compare(hashed_process_data->next_good_time, evtime) <= 0) { +#if 0 + processlist_get_pixels_from_data(process_list, + hashed_process_data, + &y, + &height); +#endif //0 TimeWindow time_window = lttvwindow_get_time_window(control_flow_data->tab); @@ -2327,38 +2347,34 @@ int before_process_hook(void *hook_data, void *call_data) if(process_list->current_hash_data[tfc->index] != NULL) { hashed_process_data = process_list->current_hash_data[tfc->index]; - processlist_get_pixels_from_data(process_list, - hashed_process_data, - &y, - &height); - } else if(processlist_get_process_pixels(process_list, + } else { + hashed_process_data = processlist_get_process_data(process_list, + pid, + process->last_cpu_index, + &birth, + tfc->t_context->index); + if(hashed_process_data == NULL) + { + g_assert(pid == 0 || pid != process->ppid); + /* Process not present */ + const gchar *name = g_quark_to_string(process->name); + ProcessInfo *process_info; + processlist_add(process_list, pid, process->last_cpu_index, + process->ppid, &birth, tfc->t_context->index, - &y, - &height, - &hashed_process_data) == 1) - { - g_assert(pid == 0 || pid != process->ppid); - /* Process not present */ - const gchar *name = g_quark_to_string(process->name); - ProcessInfo *process_info; - processlist_add(process_list, - pid, - process->last_cpu_index, - process->ppid, - &birth, - tfc->t_context->index, - name, - &pl_height, - &process_info, - &hashed_process_data); - processlist_get_pixels_from_data(process_list, - hashed_process_data, - &y, - &height); - drawing_insert_square( control_flow_data->drawing, y, height); + name, + &pl_height, + &process_info, + &hashed_process_data); + processlist_get_pixels_from_data(process_list, + hashed_process_data, + &y, + &height); + drawing_insert_square( control_flow_data->drawing, y, height); + } } /* Now, the process is in the state hash and our own process hash. @@ -2376,6 +2392,10 @@ int before_process_hook(void *hook_data, void *call_data) evtime) > 0) { if(hashed_process_data->x.middle_marked == FALSE) { + processlist_get_pixels_from_data(process_list, + hashed_process_data, + &y, + &height); TimeWindow time_window = lttvwindow_get_time_window(control_flow_data->tab); @@ -2401,13 +2421,17 @@ int before_process_hook(void *hook_data, void *call_data) hashed_process_data->x.middle_marked = TRUE; } } else { - TimeWindow time_window = - lttvwindow_get_time_window(control_flow_data->tab); + processlist_get_pixels_from_data(process_list, + hashed_process_data, + &y, + &height); + 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; #endif //EXTRA_CHECK guint x; @@ -2538,14 +2562,12 @@ int after_process_hook(void *hook_data, void *call_data) birth = process_child->creation_time; - if(processlist_get_process_pixels(process_list, + hashed_process_data_child = processlist_get_process_data(process_list, child_pid, process_child->last_cpu_index, &birth, - tfc->t_context->index, - &y_child, - &height, - &hashed_process_data_child) == 1) + tfc->t_context->index); + if(hashed_process_data_child == NULL) { g_assert(child_pid == 0 || child_pid != process_child->ppid); /* Process not present */ @@ -2572,6 +2594,12 @@ int after_process_hook(void *hook_data, void *call_data) if(ltt_time_compare(hashed_process_data_child->next_good_time, evtime) <= 0) { +#if 0 + processlist_get_pixels_from_data(process_list, + hashed_process_data_child, + &y_child, + &height); +#endif //0 TimeWindow time_window = lttvwindow_get_time_window(control_flow_data->tab); @@ -2623,20 +2651,13 @@ int after_process_hook(void *hook_data, void *call_data) if(process_list->current_hash_data[tfc->index] != NULL) { hashed_process_data = process_list->current_hash_data[tfc->index]; - processlist_get_pixels_from_data(process_list, - hashed_process_data, - &y, - &height); - } else { - if(processlist_get_process_pixels(process_list, + hashed_process_data = processlist_get_process_data(process_list, pid, process->last_cpu_index, &birth, - tfc->t_context->index, - &y, - &height, - &hashed_process_data) == 1) + tfc->t_context->index); + if(hashed_process_data == NULL) { g_assert(pid == 0 || pid != process->ppid); /* Process not present */ @@ -2667,6 +2688,12 @@ int after_process_hook(void *hook_data, void *call_data) if(ltt_time_compare(hashed_process_data->next_good_time, evtime) <= 0) { +#if 0 + processlist_get_pixels_from_data(process_list, + hashed_process_data, + &y, + &height); +#endif //0 TimeWindow time_window = lttvwindow_get_time_window(control_flow_data->tab); diff --git a/ltt/branches/poly/lttv/modules/gui/controlflow/processlist.c b/ltt/branches/poly/lttv/modules/gui/controlflow/processlist.c index d273167d..727f74ed 100644 --- a/ltt/branches/poly/lttv/modules/gui/controlflow/processlist.c +++ b/ltt/branches/poly/lttv/modules/gui/controlflow/processlist.c @@ -600,16 +600,13 @@ __inline__ guint processlist_get_height(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) +__inline__ HashedProcessData *processlist_get_process_data( + ProcessList *process_list, + guint pid, guint cpu, LttTime *birth, guint trace_num) { ProcessInfo process_info; gint *path_indices; GtkTreePath *tree_path; - HashedProcessData *hashed_process_data = NULL; process_info.pid = pid; if(pid == 0) @@ -619,28 +616,9 @@ __inline__ gint processlist_get_process_pixels( ProcessList *process_list, 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)) - { - 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(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); - - return 0; - } else { - *pm_hashed_process_data = hashed_process_data; - return 1; - } - + return (HashedProcessData*)g_hash_table_lookup( + process_list->process_hash, + &process_info); } diff --git a/ltt/branches/poly/lttv/modules/gui/controlflow/processlist.h b/ltt/branches/poly/lttv/modules/gui/controlflow/processlist.h index 1685c764..437110a1 100644 --- a/ltt/branches/poly/lttv/modules/gui/controlflow/processlist.h +++ b/ltt/branches/poly/lttv/modules/gui/controlflow/processlist.h @@ -114,11 +114,9 @@ int processlist_remove(ProcessList *process_list, guint pid, guint cpu, __inline__ guint processlist_get_height(ProcessList *process_list); -// Returns 0 on success -__inline__ gint processlist_get_process_pixels(ProcessList *process_list, - guint pid, guint cpu, LttTime *birth, guint trace_num, - guint *y, guint *height, - HashedProcessData **hashed_process_data); +__inline__ HashedProcessData *processlist_get_process_data( + ProcessList *process_list, + guint pid, guint cpu, LttTime *birth, guint trace_num); __inline__ gint processlist_get_pixels_from_data( ProcessList *process_list, HashedProcessData *hashed_process_data, diff --git a/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/lttvwindow.h b/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/lttvwindow.h index 790dcf50..dc64bb4a 100644 --- a/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/lttvwindow.h +++ b/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/lttvwindow.h @@ -616,7 +616,7 @@ typedef struct _EventsRequest { } EventsRequest; /* Maximum number of events to proceed at once in a chunk */ -#define CHUNK_NUM_EVENTS 500 +#define CHUNK_NUM_EVENTS 2000 /** -- 2.34.1