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=767cc2137b81a39ad1bcd46c56427f0c3bb72e7e;hpb=e38d9ea05da26962532573de017dd2e1893683ca;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 767cc213..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(); @@ -373,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) @@ -393,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); @@ -407,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, @@ -450,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 { @@ -481,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 */ @@ -539,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 @@ -554,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); @@ -568,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, @@ -613,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 { @@ -645,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 */ @@ -772,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 @@ -783,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); @@ -797,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, @@ -809,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, @@ -893,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); @@ -907,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); @@ -928,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, @@ -940,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; } @@ -974,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 { @@ -1007,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 */ @@ -1092,6 +1101,7 @@ int before_process_exit_hook(void *hook_data, void *call_data) /* 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; @@ -1104,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); @@ -1125,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, @@ -1168,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 { @@ -1201,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 */ @@ -1286,6 +1296,7 @@ int before_process_release_hook(void *hook_data, void *call_data) LttTime evtime = ltt_event_time(e); + guint trace_num = ts->parent.index; guint pid; { @@ -1313,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); @@ -1327,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, @@ -1369,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 { @@ -1402,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 */ @@ -1506,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. */ @@ -1513,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); @@ -1527,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, @@ -1623,6 +1635,7 @@ int after_process_exit_hook(void *hook_data, void *call_data) /* 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. */ @@ -1637,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); @@ -1658,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, @@ -1671,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; } @@ -1728,6 +1741,7 @@ int after_fs_exec_hook(void *hook_data, void *call_data) return FALSE; guint cpu = tfs->cpu; + guint trace_num = ts->parent.index; LttvProcessState *process = ts->running_process[cpu]; g_assert(process != NULL); @@ -1742,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); @@ -1763,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, @@ -1775,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; } @@ -1808,6 +1822,7 @@ int after_user_generic_thread_brand_hook(void *hook_data, void *call_data) return FALSE; guint cpu = tfs->cpu; + guint trace_num = ts->parent.index; LttvProcessState *process = ts->running_process[cpu]; g_assert(process != NULL); @@ -1822,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); @@ -1843,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, @@ -1855,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; } @@ -1907,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; { @@ -1918,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 @@ -1929,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) @@ -1945,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, @@ -2604,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 */