X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Fmodules%2Fgui%2Fcontrolflow%2Feventhooks.c;h=cffd9b89b9ccc6051f82beb2172af29fe5a81122;hb=c7620c793509802e9bc0b789a5b72b9510bb6b0e;hp=53d3a8834681d7a5615662bbf6bbc34c1c5ef8bb;hpb=dd455fb8aa68172162fa7a44c534a405bccf1aa4;p=lttv.git diff --git a/ltt/branches/poly/lttv/modules/gui/controlflow/eventhooks.c b/ltt/branches/poly/lttv/modules/gui/controlflow/eventhooks.c index 53d3a883..cffd9b89 100644 --- a/ltt/branches/poly/lttv/modules/gui/controlflow/eventhooks.c +++ b/ltt/branches/poly/lttv/modules/gui/controlflow/eventhooks.c @@ -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) {