X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Fmodules%2Fgui%2Fcontrolflow%2Feventhooks.c;h=65f47eec4a17c250afd1763f7d6a6cf784bc0a52;hb=7df20ca43b06343b299d2a79512a44441f148f1d;hp=7e2cc1d062479abb7bfd94b07a5cbf3bbd884e88;hpb=e433e6d6da2cc572a3d14257abe18bc3afd5c7e6;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 7e2cc1d0..65f47eec 100644 --- a/ltt/branches/poly/lttv/modules/gui/controlflow/eventhooks.c +++ b/ltt/branches/poly/lttv/modules/gui/controlflow/eventhooks.c @@ -79,6 +79,8 @@ #define MAX_PATH_LEN 256 +#define STATE_LINE_WIDTH 4 +#define COLLISION_POSITION(height) (((height - STATE_LINE_WIDTH)/2) -3) extern GSList *g_legend_list; @@ -120,6 +122,7 @@ static void request_background_data(ControlFlowData *control_flow_data) gint num_traces = lttv_traceset_number(tsc->ts); gint i; LttvTrace *trace; + LttvTraceState *tstate; LttvHooks *background_ready_hook = lttv_hooks_new(); @@ -129,8 +132,10 @@ static void request_background_data(ControlFlowData *control_flow_data) for(i=0;its, i); + tstate = LTTV_TRACE_STATE(tsc->traces[i]); - if(lttvwindowtraces_get_ready(g_quark_from_string("state"),trace)==FALSE) { + if(lttvwindowtraces_get_ready(g_quark_from_string("state"),trace)==FALSE + && !tstate->has_precomputed_states) { if(lttvwindowtraces_get_in_progress(g_quark_from_string("state"), trace) == FALSE) { @@ -157,7 +162,7 @@ static void request_background_data(ControlFlowData *control_flow_data) control_flow_data->background_info_waiting++; } } else { - /* Data ready. Be its nature, this viewer doesn't need to have + /* Data ready. By its nature, this viewer doesn't need to have * its data ready hook called there, because a background * request is always linked with a redraw. */ @@ -269,7 +274,7 @@ int event_selected_hook(void *hook_data, void *call_data) static inline PropertiesLine prepare_s_e_line(LttvProcessState *process) { PropertiesLine prop_line; - prop_line.line_width = 2; + prop_line.line_width = STATE_LINE_WIDTH; prop_line.style = GDK_LINE_SOLID; prop_line.y = MIDDLE; //GdkColormap *colormap = gdk_colormap_get_system(); @@ -345,8 +350,10 @@ int before_schedchange_hook(void *hook_data, void *call_data) LttEvent *e; e = ltt_tracefile_get_event(tfc->tf); + gint target_pid_saved = tfc->target_pid; LttTime evtime = ltt_event_time(e); + LttvFilter *filter = control_flow_data->filter; /* we are in a schedchange, before the state update. We must draw the * items corresponding to the state before it changes : now is the right @@ -360,7 +367,10 @@ int before_schedchange_hook(void *hook_data, void *call_data) pid_in = ltt_event_get_long_unsigned(e, thf->f2); } - { + tfc->target_pid = pid_out; + if(!filter || !filter->head || + lttv_filter_tree_parse(filter->head,e,tfc->tf, + tfc->t_context->t,tfc)) { /* For the pid_out */ /* First, check if the current process is in the state computation * process list. If it is there, that means we must add it right now and @@ -368,6 +378,7 @@ int before_schedchange_hook(void *hook_data, void *call_data) * present, it's a new process and it was not present : it will * be added after the state update. */ guint cpu = tfs->cpu; + guint trace_num = ts->parent.index; LttvProcessState *process = ts->running_process[cpu]; /* unknown state, bad current pid */ if(process->pid != pid_out) @@ -388,7 +399,7 @@ int before_schedchange_hook(void *hook_data, void *call_data) pid_out, process->cpu, &birth, - tfc->t_context->index); + trace_num); if(hashed_process_data == NULL) { g_assert(pid_out == 0 || pid_out != process->ppid); @@ -402,7 +413,7 @@ int before_schedchange_hook(void *hook_data, void *call_data) process->cpu, process->ppid, &birth, - tfc->t_context->index, + trace_num, process->name, process->brand, &pl_height, @@ -445,7 +456,7 @@ int before_schedchange_hook(void *hook_data, void *call_data) gdk_draw_point(hashed_process_data->pixmap, drawing->gc, x, - (hashed_process_data->height/2)-3); + COLLISION_POSITION(hashed_process_data->height)); hashed_process_data->x.middle_marked = TRUE; } } else { @@ -476,7 +487,7 @@ int before_schedchange_hook(void *hook_data, void *call_data) gdk_draw_point(hashed_process_data->pixmap, drawing->gc, x, - (hashed_process_data->height/2)-3); + COLLISION_POSITION(hashed_process_data->height)); hashed_process_data->x.middle_marked = TRUE; } /* jump */ @@ -521,7 +532,10 @@ int before_schedchange_hook(void *hook_data, void *call_data) } } - { + tfc->target_pid = pid_in; + if(!filter || !filter->head || + lttv_filter_tree_parse(filter->head,e,tfc->tf, + tfc->t_context->t,tfc)) { /* For the pid_in */ /* First, check if the current process is in the state computation * process list. If it is there, that means we must add it right now and @@ -531,6 +545,7 @@ int before_schedchange_hook(void *hook_data, void *call_data) LttvProcessState *process; process = lttv_state_find_process(ts, tfs->cpu, pid_in); + guint trace_num = ts->parent.index; if(process != NULL) { /* Well, the process existed : we must get it in the process hash @@ -546,7 +561,7 @@ int before_schedchange_hook(void *hook_data, void *call_data) pid_in, tfs->cpu, &birth, - tfc->t_context->index); + trace_num); if(hashed_process_data == NULL) { g_assert(pid_in == 0 || pid_in != process->ppid); @@ -560,7 +575,7 @@ int before_schedchange_hook(void *hook_data, void *call_data) tfs->cpu, process->ppid, &birth, - tfc->t_context->index, + trace_num, process->name, process->brand, &pl_height, @@ -605,7 +620,7 @@ int before_schedchange_hook(void *hook_data, void *call_data) gdk_draw_point(hashed_process_data->pixmap, drawing->gc, x, - (hashed_process_data->height/2)-3); + COLLISION_POSITION(hashed_process_data->height)); hashed_process_data->x.middle_marked = TRUE; } } else { @@ -637,7 +652,7 @@ int before_schedchange_hook(void *hook_data, void *call_data) gdk_draw_point(hashed_process_data->pixmap, drawing->gc, x, - (hashed_process_data->height/2)-3); + COLLISION_POSITION(hashed_process_data->height)); hashed_process_data->x.middle_marked = TRUE; } /* jump */ @@ -683,6 +698,7 @@ int before_schedchange_hook(void *hook_data, void *call_data) } else g_warning("Cannot find pin_in in schedchange %u", pid_in); } + tfc->target_pid = target_pid_saved; return 0; @@ -735,6 +751,12 @@ int after_schedchange_hook(void *hook_data, void *call_data) LttEvent *e; 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)) + return FALSE; + LttTime evtime = ltt_event_time(e); /* Add process to process list (if not present) */ @@ -757,6 +779,7 @@ int after_schedchange_hook(void *hook_data, void *call_data) //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 @@ -768,7 +791,7 @@ int after_schedchange_hook(void *hook_data, void *call_data) pid_in, process_in->cpu, &birth, - tfc->t_context->index); + trace_num); if(hashed_process_data_in == NULL) { g_assert(pid_in == 0 || pid_in != process_in->ppid); @@ -782,7 +805,7 @@ int after_schedchange_hook(void *hook_data, void *call_data) process_in->cpu, process_in->ppid, &birth, - tfc->t_context->index, + trace_num, process_in->name, process_in->brand, &pl_height, @@ -794,7 +817,7 @@ int after_schedchange_hook(void *hook_data, void *call_data) gtk_widget_queue_draw(drawing->drawing_area); } /* Set the current process */ - process_list->current_hash_data[process_in->cpu] = + 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, @@ -863,6 +886,12 @@ int before_execmode_hook(void *hook_data, void *call_data) LttEvent *e; 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)) + return FALSE; + LttTime evtime = ltt_event_time(e); /* we are in a execmode, before the state update. We must draw the @@ -872,6 +901,7 @@ int before_execmode_hook(void *hook_data, void *call_data) /* For the pid */ //LttvProcessState *process = tfs->process; guint cpu = tfs->cpu; + guint trace_num = ts->parent.index; LttvProcessState *process = ts->running_process[cpu]; g_assert(process != NULL); @@ -886,14 +916,14 @@ int before_execmode_hook(void *hook_data, void *call_data) ProcessList *process_list = control_flow_data->process_list; LttTime birth = process->creation_time; - if(likely(process_list->current_hash_data[cpu] != NULL)) { - hashed_process_data = process_list->current_hash_data[cpu]; + if(likely(process_list->current_hash_data[trace_num][cpu] != NULL)) { + hashed_process_data = process_list->current_hash_data[trace_num][cpu]; } else { hashed_process_data = processlist_get_process_data(process_list, pid, process->cpu, &birth, - tfc->t_context->index); + trace_num); if(unlikely(hashed_process_data == NULL)) { g_assert(pid == 0 || pid != process->ppid); @@ -907,7 +937,7 @@ int before_execmode_hook(void *hook_data, void *call_data) process->cpu, process->ppid, &birth, - tfc->t_context->index, + trace_num, process->name, process->brand, &pl_height, @@ -919,7 +949,7 @@ int before_execmode_hook(void *hook_data, void *call_data) gtk_widget_queue_draw(drawing->drawing_area); } /* Set the current process */ - process_list->current_hash_data[process->cpu] = + process_list->current_hash_data[trace_num][process->cpu] = hashed_process_data; } @@ -953,7 +983,7 @@ int before_execmode_hook(void *hook_data, void *call_data) gdk_draw_point(hashed_process_data->pixmap, drawing->gc, x, - (hashed_process_data->height/2)-3); + COLLISION_POSITION(hashed_process_data->height)); hashed_process_data->x.middle_marked = TRUE; } } else { @@ -986,7 +1016,7 @@ int before_execmode_hook(void *hook_data, void *call_data) gdk_draw_point(hashed_process_data->pixmap, drawing->gc, x, - (hashed_process_data->height/2)-3); + COLLISION_POSITION(hashed_process_data->height)); hashed_process_data->x.middle_marked = TRUE; } /* jump */ @@ -1060,11 +1090,18 @@ int before_process_exit_hook(void *hook_data, void *call_data) LttEvent *e; 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)) + return FALSE; + LttTime evtime = ltt_event_time(e); /* Add process to process list (if not present) */ //LttvProcessState *process = tfs->process; guint cpu = tfs->cpu; + guint trace_num = ts->parent.index; LttvProcessState *process = ts->running_process[cpu]; guint pid = process->pid; LttTime birth; @@ -1077,14 +1114,14 @@ int before_process_exit_hook(void *hook_data, void *call_data) birth = process->creation_time; - if(likely(process_list->current_hash_data[cpu] != NULL)) { - hashed_process_data = process_list->current_hash_data[cpu]; + if(likely(process_list->current_hash_data[trace_num][cpu] != NULL)) { + hashed_process_data = process_list->current_hash_data[trace_num][cpu]; } else { hashed_process_data = processlist_get_process_data(process_list, pid, process->cpu, &birth, - tfc->t_context->index); + trace_num); if(unlikely(hashed_process_data == NULL)) { g_assert(pid == 0 || pid != process->ppid); @@ -1098,7 +1135,7 @@ int before_process_exit_hook(void *hook_data, void *call_data) process->cpu, process->ppid, &birth, - tfc->t_context->index, + trace_num, process->name, process->brand, &pl_height, @@ -1141,7 +1178,7 @@ int before_process_exit_hook(void *hook_data, void *call_data) gdk_draw_point(hashed_process_data->pixmap, drawing->gc, x, - (hashed_process_data->height/2)-3); + COLLISION_POSITION(hashed_process_data->height)); hashed_process_data->x.middle_marked = TRUE; } } else { @@ -1174,7 +1211,7 @@ int before_process_exit_hook(void *hook_data, void *call_data) gdk_draw_point(hashed_process_data->pixmap, drawing->gc, x, - (hashed_process_data->height/2)-3); + COLLISION_POSITION(hashed_process_data->height)); hashed_process_data->x.middle_marked = TRUE; } /* jump */ @@ -1251,8 +1288,15 @@ int before_process_release_hook(void *hook_data, void *call_data) LttEvent *e; 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)) + return FALSE; + LttTime evtime = ltt_event_time(e); + guint trace_num = ts->parent.index; guint pid; { @@ -1280,7 +1324,7 @@ int before_process_release_hook(void *hook_data, void *call_data) pid, process->cpu, &birth, - tfc->t_context->index); + trace_num); if(unlikely(hashed_process_data == NULL)) { g_assert(pid == 0 || pid != process->ppid); @@ -1294,7 +1338,7 @@ int before_process_release_hook(void *hook_data, void *call_data) process->cpu, process->ppid, &birth, - tfc->t_context->index, + trace_num, process->name, process->brand, &pl_height, @@ -1336,7 +1380,7 @@ int before_process_release_hook(void *hook_data, void *call_data) gdk_draw_point(hashed_process_data->pixmap, drawing->gc, x, - (hashed_process_data->height/2)-3); + COLLISION_POSITION(hashed_process_data->height)); hashed_process_data->x.middle_marked = TRUE; } } else { @@ -1369,7 +1413,7 @@ int before_process_release_hook(void *hook_data, void *call_data) gdk_draw_point(hashed_process_data->pixmap, drawing->gc, x, - (hashed_process_data->height/2)-3); + COLLISION_POSITION(hashed_process_data->height)); hashed_process_data->x.middle_marked = TRUE; } /* jump */ @@ -1446,6 +1490,12 @@ int after_process_fork_hook(void *hook_data, void *call_data) LttEvent *e; 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)) + return FALSE; + LttTime evtime = ltt_event_time(e); guint child_pid; @@ -1467,6 +1517,7 @@ int after_process_fork_hook(void *hook_data, void *call_data) g_assert(process_child != NULL); birth = process_child->creation_time; + guint trace_num = ts->parent.index; /* Cannot use current process, because this action is done by the parent * on its child. */ @@ -1474,7 +1525,7 @@ int after_process_fork_hook(void *hook_data, void *call_data) child_pid, process_child->cpu, &birth, - tfc->t_context->index); + trace_num); if(likely(hashed_process_data_child == NULL)) { g_assert(child_pid == 0 || child_pid != process_child->ppid); @@ -1488,7 +1539,7 @@ int after_process_fork_hook(void *hook_data, void *call_data) process_child->cpu, process_child->ppid, &birth, - tfc->t_context->index, + trace_num, process_child->name, process_child->brand, &pl_height, @@ -1573,11 +1624,18 @@ int after_process_exit_hook(void *hook_data, void *call_data) LttEvent *e; 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)) + return FALSE; + LttTime evtime = ltt_event_time(e); /* Add process to process list (if not present) */ //LttvProcessState *process = tfs->process; guint cpu = tfs->cpu; + guint trace_num = ts->parent.index; LttvProcessState *process = ts->running_process[cpu]; /* It should exist, because we are after the state update. */ @@ -1592,14 +1650,14 @@ int after_process_exit_hook(void *hook_data, void *call_data) birth = process->creation_time; - if(likely(process_list->current_hash_data[cpu] != NULL) ){ - hashed_process_data = process_list->current_hash_data[cpu]; + if(likely(process_list->current_hash_data[trace_num][cpu] != NULL) ){ + hashed_process_data = process_list->current_hash_data[trace_num][cpu]; } else { hashed_process_data = processlist_get_process_data(process_list, pid, process->cpu, &birth, - tfc->t_context->index); + trace_num); if(unlikely(hashed_process_data == NULL)) { g_assert(pid == 0 || pid != process->ppid); @@ -1613,7 +1671,7 @@ int after_process_exit_hook(void *hook_data, void *call_data) process->cpu, process->ppid, &birth, - tfc->t_context->index, + trace_num, process->name, process->brand, &pl_height, @@ -1626,7 +1684,7 @@ int after_process_exit_hook(void *hook_data, void *call_data) } /* Set the current process */ - process_list->current_hash_data[process->cpu] = + process_list->current_hash_data[trace_num][process->cpu] = hashed_process_data; } @@ -1673,7 +1731,17 @@ int after_fs_exec_hook(void *hook_data, void *call_data) LttvTraceState *ts = (LttvTraceState *)tfc->t_context; + LttEvent *e; + 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)) + return FALSE; + guint cpu = tfs->cpu; + guint trace_num = ts->parent.index; LttvProcessState *process = ts->running_process[cpu]; g_assert(process != NULL); @@ -1688,14 +1756,14 @@ int after_fs_exec_hook(void *hook_data, void *call_data) ProcessList *process_list = control_flow_data->process_list; LttTime birth = process->creation_time; - if(likely(process_list->current_hash_data[cpu] != NULL)) { - hashed_process_data = process_list->current_hash_data[cpu]; + if(likely(process_list->current_hash_data[trace_num][cpu] != NULL)) { + hashed_process_data = process_list->current_hash_data[trace_num][cpu]; } else { hashed_process_data = processlist_get_process_data(process_list, pid, process->cpu, &birth, - tfc->t_context->index); + trace_num); if(unlikely(hashed_process_data == NULL)) { g_assert(pid == 0 || pid != process->ppid); @@ -1709,7 +1777,7 @@ int after_fs_exec_hook(void *hook_data, void *call_data) process->cpu, process->ppid, &birth, - tfc->t_context->index, + trace_num, process->name, process->brand, &pl_height, @@ -1721,7 +1789,7 @@ int after_fs_exec_hook(void *hook_data, void *call_data) gtk_widget_queue_draw(drawing->drawing_area); } /* Set the current process */ - process_list->current_hash_data[process->cpu] = + process_list->current_hash_data[trace_num][process->cpu] = hashed_process_data; } @@ -1744,7 +1812,17 @@ int after_user_generic_thread_brand_hook(void *hook_data, void *call_data) LttvTraceState *ts = (LttvTraceState *)tfc->t_context; + LttEvent *e; + 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)) + return FALSE; + guint cpu = tfs->cpu; + guint trace_num = ts->parent.index; LttvProcessState *process = ts->running_process[cpu]; g_assert(process != NULL); @@ -1759,14 +1837,14 @@ int after_user_generic_thread_brand_hook(void *hook_data, void *call_data) ProcessList *process_list = control_flow_data->process_list; LttTime birth = process->creation_time; - if(likely(process_list->current_hash_data[cpu] != NULL)) { - hashed_process_data = process_list->current_hash_data[cpu]; + if(likely(process_list->current_hash_data[trace_num][cpu] != NULL)) { + hashed_process_data = process_list->current_hash_data[trace_num][cpu]; } else { hashed_process_data = processlist_get_process_data(process_list, pid, process->cpu, &birth, - tfc->t_context->index); + trace_num); if(unlikely(hashed_process_data == NULL)) { g_assert(pid == 0 || pid != process->ppid); @@ -1780,7 +1858,7 @@ int after_user_generic_thread_brand_hook(void *hook_data, void *call_data) process->cpu, process->ppid, &birth, - tfc->t_context->index, + trace_num, process->name, process->brand, &pl_height, @@ -1792,7 +1870,7 @@ int after_user_generic_thread_brand_hook(void *hook_data, void *call_data) gtk_widget_queue_draw(drawing->drawing_area); } /* Set the current process */ - process_list->current_hash_data[process->cpu] = + process_list->current_hash_data[trace_num][process->cpu] = hashed_process_data; } @@ -1829,6 +1907,12 @@ int after_event_enum_process_hook(void *hook_data, void *call_data) LttEvent *e; 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)) + return FALSE; + LttTime evtime = ltt_event_time(e); /* Add process to process list (if not present) */ @@ -1838,6 +1922,7 @@ int after_event_enum_process_hook(void *hook_data, void *call_data) HashedProcessData *hashed_process_data_in = NULL; ProcessList *process_list = control_flow_data->process_list; + guint trace_num = ts->parent.index; guint pid_in; { @@ -1849,6 +1934,7 @@ int after_event_enum_process_hook(void *hook_data, void *call_data) 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 @@ -1860,7 +1946,7 @@ int after_event_enum_process_hook(void *hook_data, void *call_data) pid_in, process_in->cpu, &birth, - tfc->t_context->index); + trace_num); if(hashed_process_data_in == NULL) { if(pid_in != 0 && pid_in == process_in->ppid) @@ -1876,7 +1962,7 @@ int after_event_enum_process_hook(void *hook_data, void *call_data) process_in->cpu, process_in->ppid, &birth, - tfc->t_context->index, + trace_num, process_in->name, process_in->brand, &pl_height, @@ -2535,10 +2621,19 @@ int after_chunk(void *hook_data, void *call_data) LttTime end_time; ProcessList *process_list = control_flow_data->process_list; + guint i; + LttvTraceset *traceset = tsc->ts; + guint nb_trace = lttv_traceset_number(traceset); + + /* Only execute when called for the first trace's events request */ + if(!process_list->current_hash_data) return; + for(i = 0 ; i < nb_trace ; i++) { + g_free(process_list->current_hash_data[i]); + } g_free(process_list->current_hash_data); process_list->current_hash_data = NULL; - + if(tfc != NULL) end_time = LTT_TIME_MIN(tfc->timestamp, events_request->end_time); else /* end of traceset, or position now out of request : end */