From 58a9b31ba0dbc1df35a2d375599a3c7996079fbe Mon Sep 17 00:00:00 2001 From: pmf Date: Tue, 31 Jul 2007 19:46:12 +0000 Subject: [PATCH] first working version of resourceview git-svn-id: http://ltt.polymtl.ca/svn@2557 04897980-b3bd-0310-b5e0-8ef037075253 --- .../poly/lttv/modules/gui/resourceview/cfv.c | 2 +- .../lttv/modules/gui/resourceview/drawing.c | 264 +- .../modules/gui/resourceview/eventhooks.c | 3304 +++++++++-------- .../modules/gui/resourceview/eventhooks.h | 2 +- .../lttv/modules/gui/resourceview/module.c | 4 +- .../modules/gui/resourceview/processlist.c | 468 +-- .../modules/gui/resourceview/processlist.h | 52 +- 7 files changed, 2074 insertions(+), 2022 deletions(-) diff --git a/ltt/branches/poly/lttv/modules/gui/resourceview/cfv.c b/ltt/branches/poly/lttv/modules/gui/resourceview/cfv.c index f7a25827..3f229d10 100644 --- a/ltt/branches/poly/lttv/modules/gui/resourceview/cfv.c +++ b/ltt/branches/poly/lttv/modules/gui/resourceview/cfv.c @@ -133,7 +133,7 @@ static void filter_button (GtkToolButton *toolbutton, * @return The widget created. */ ControlFlowData * -guicontrolflow(LttvPluginTab *ptab) +resourceview(LttvPluginTab *ptab) { Tab *tab = ptab->tab; GtkWidget *tmp_toolbar_icon; diff --git a/ltt/branches/poly/lttv/modules/gui/resourceview/drawing.c b/ltt/branches/poly/lttv/modules/gui/resourceview/drawing.c index e0b92aa3..81edb1e3 100644 --- a/ltt/branches/poly/lttv/modules/gui/resourceview/drawing.c +++ b/ltt/branches/poly/lttv/modules/gui/resourceview/drawing.c @@ -36,8 +36,8 @@ #include "eventhooks.h" #include "cfv.h" -#define g_info(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format) -#define g_debug(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, format) +//#define g_info(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format) +//#define g_debug(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, format) //FIXME // fixed #define TRACE_NUMBER 0 @@ -225,69 +225,69 @@ void drawing_data_request(Drawing_t *drawing, /* before hooks */ - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL_ARCH, LTT_EVENT_SYSCALL_ENTRY, - LTT_FIELD_SYSCALL_ID, 0, 0, - before_execmode_hook, - events_request, - &g_array_index(hooks, LttvTraceHook, before_hn++)); - if(ret) before_hn--; - - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL_ARCH, LTT_EVENT_SYSCALL_EXIT, - 0, 0, 0, - before_execmode_hook, - events_request, - &g_array_index(hooks, LttvTraceHook, before_hn++)); - if(ret) before_hn--; - - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL_ARCH, LTT_EVENT_TRAP_ENTRY, - LTT_FIELD_TRAP_ID, 0, 0, - before_execmode_hook, - events_request, - &g_array_index(hooks, LttvTraceHook, before_hn++)); - if(ret) before_hn--; - - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL_ARCH, LTT_EVENT_TRAP_EXIT, - 0, 0, 0, - before_execmode_hook, - events_request, - &g_array_index(hooks, LttvTraceHook, before_hn++)); - if(ret) before_hn--; - - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL, LTT_EVENT_IRQ_ENTRY, - LTT_FIELD_IRQ_ID, 0, 0, - before_execmode_hook, - events_request, - &g_array_index(hooks, LttvTraceHook, before_hn++)); - if(ret) before_hn--; - - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL, LTT_EVENT_IRQ_EXIT, - 0, 0, 0, - before_execmode_hook, - events_request, - &g_array_index(hooks, LttvTraceHook, before_hn++)); - if(ret) before_hn--; - - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL, LTT_EVENT_SOFT_IRQ_ENTRY, - LTT_FIELD_SOFT_IRQ_ID, 0, 0, - before_execmode_hook, - events_request, - &g_array_index(hooks, LttvTraceHook, before_hn++)); - if(ret) before_hn--; - - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL, LTT_EVENT_SOFT_IRQ_EXIT, - 0, 0, 0, - before_execmode_hook, - events_request, - &g_array_index(hooks, LttvTraceHook, before_hn++)); - if(ret) before_hn--; +// ret = lttv_trace_find_hook(ts->parent.t, +// LTT_FACILITY_KERNEL_ARCH, LTT_EVENT_SYSCALL_ENTRY, +// LTT_FIELD_SYSCALL_ID, 0, 0, +// before_execmode_hook, +// events_request, +// &g_array_index(hooks, LttvTraceHook, before_hn++)); +// if(ret) before_hn--; +// +// ret = lttv_trace_find_hook(ts->parent.t, +// LTT_FACILITY_KERNEL_ARCH, LTT_EVENT_SYSCALL_EXIT, +// 0, 0, 0, +// before_execmode_hook, +// events_request, +// &g_array_index(hooks, LttvTraceHook, before_hn++)); +// if(ret) before_hn--; +// +// ret = lttv_trace_find_hook(ts->parent.t, +// LTT_FACILITY_KERNEL_ARCH, LTT_EVENT_TRAP_ENTRY, +// LTT_FIELD_TRAP_ID, 0, 0, +// before_execmode_hook, +// events_request, +// &g_array_index(hooks, LttvTraceHook, before_hn++)); +// if(ret) before_hn--; +// +// ret = lttv_trace_find_hook(ts->parent.t, +// LTT_FACILITY_KERNEL_ARCH, LTT_EVENT_TRAP_EXIT, +// 0, 0, 0, +// before_execmode_hook, +// events_request, +// &g_array_index(hooks, LttvTraceHook, before_hn++)); +// if(ret) before_hn--; +// +// ret = lttv_trace_find_hook(ts->parent.t, +// LTT_FACILITY_KERNEL, LTT_EVENT_IRQ_ENTRY, +// LTT_FIELD_IRQ_ID, 0, 0, +// before_execmode_hook, +// events_request, +// &g_array_index(hooks, LttvTraceHook, before_hn++)); +// if(ret) before_hn--; +// +// ret = lttv_trace_find_hook(ts->parent.t, +// LTT_FACILITY_KERNEL, LTT_EVENT_IRQ_EXIT, +// 0, 0, 0, +// before_execmode_hook, +// events_request, +// &g_array_index(hooks, LttvTraceHook, before_hn++)); +// if(ret) before_hn--; +// +// ret = lttv_trace_find_hook(ts->parent.t, +// LTT_FACILITY_KERNEL, LTT_EVENT_SOFT_IRQ_ENTRY, +// LTT_FIELD_SOFT_IRQ_ID, 0, 0, +// before_execmode_hook, +// events_request, +// &g_array_index(hooks, LttvTraceHook, before_hn++)); +// if(ret) before_hn--; +// +// ret = lttv_trace_find_hook(ts->parent.t, +// LTT_FACILITY_KERNEL, LTT_EVENT_SOFT_IRQ_EXIT, +// 0, 0, 0, +// before_execmode_hook, +// events_request, +// &g_array_index(hooks, LttvTraceHook, before_hn++)); +// if(ret) before_hn--; ret = lttv_trace_find_hook(ts->parent.t, @@ -298,29 +298,29 @@ void drawing_data_request(Drawing_t *drawing, &g_array_index(hooks, LttvTraceHook, before_hn++)); if(ret) before_hn--; - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL, LTT_EVENT_PROCESS_EXIT, - LTT_FIELD_PID, 0, 0, - before_process_exit_hook, - events_request, - &g_array_index(hooks, LttvTraceHook, before_hn++)); - if(ret) before_hn--; - - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL, LTT_EVENT_PROCESS_FREE, - LTT_FIELD_PID, 0, 0, - before_process_release_hook, - events_request, - &g_array_index(hooks, LttvTraceHook, before_hn++)); - if(ret) before_hn--; - - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_LIST, LTT_EVENT_STATEDUMP_END, - 0, 0, 0, - before_statedump_end, - events_request, - &g_array_index(hooks, LttvTraceHook, before_hn++)); - if(ret) before_hn--; +// ret = lttv_trace_find_hook(ts->parent.t, +// LTT_FACILITY_KERNEL, LTT_EVENT_PROCESS_EXIT, +// LTT_FIELD_PID, 0, 0, +// before_process_exit_hook, +// events_request, +// &g_array_index(hooks, LttvTraceHook, before_hn++)); +// if(ret) before_hn--; +// +// ret = lttv_trace_find_hook(ts->parent.t, +// LTT_FACILITY_KERNEL, LTT_EVENT_PROCESS_FREE, +// LTT_FIELD_PID, 0, 0, +// before_process_release_hook, +// events_request, +// &g_array_index(hooks, LttvTraceHook, before_hn++)); +// if(ret) before_hn--; +// +// ret = lttv_trace_find_hook(ts->parent.t, +// LTT_FACILITY_LIST, LTT_EVENT_STATEDUMP_END, +// 0, 0, 0, +// before_statedump_end, +// events_request, +// &g_array_index(hooks, LttvTraceHook, before_hn++)); +// if(ret) before_hn--; #if 0 lttv_trace_find_hook(ts->parent.t, @@ -381,45 +381,45 @@ void drawing_data_request(Drawing_t *drawing, &g_array_index(hooks, LttvTraceHook, after_hn++)); if(ret) after_hn--; - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL, LTT_EVENT_PROCESS_FORK, - LTT_FIELD_PARENT_PID, LTT_FIELD_CHILD_PID, 0, - after_process_fork_hook, - events_request, - &g_array_index(hooks, LttvTraceHook, after_hn++)); - if(ret) after_hn--; - - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL, LTT_EVENT_PROCESS_EXIT, - LTT_FIELD_PID, 0, 0, - after_process_exit_hook, - events_request, - &g_array_index(hooks, LttvTraceHook, after_hn++)); - if(ret) after_hn--; - - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_FS, LTT_EVENT_EXEC, - 0, 0, 0, - after_fs_exec_hook, - events_request, - &g_array_index(hooks, LttvTraceHook, after_hn++)); - if(ret) after_hn--; - - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_USER_GENERIC, LTT_EVENT_THREAD_BRAND, - LTT_FIELD_NAME, 0, 0, - after_user_generic_thread_brand_hook, - events_request, - &g_array_index(hooks, LttvTraceHook, after_hn++)); - if(ret) after_hn--; - - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_LIST, LTT_EVENT_PROCESS_STATE, - LTT_FIELD_PID, LTT_FIELD_PARENT_PID, LTT_FIELD_NAME, - after_event_enum_process_hook, - events_request, - &g_array_index(hooks, LttvTraceHook, after_hn++)); - if(ret) after_hn--; +// ret = lttv_trace_find_hook(ts->parent.t, +// LTT_FACILITY_KERNEL, LTT_EVENT_PROCESS_FORK, +// LTT_FIELD_PARENT_PID, LTT_FIELD_CHILD_PID, 0, +// after_process_fork_hook, +// events_request, +// &g_array_index(hooks, LttvTraceHook, after_hn++)); +// if(ret) after_hn--; +// +// ret = lttv_trace_find_hook(ts->parent.t, +// LTT_FACILITY_KERNEL, LTT_EVENT_PROCESS_EXIT, +// LTT_FIELD_PID, 0, 0, +// after_process_exit_hook, +// events_request, +// &g_array_index(hooks, LttvTraceHook, after_hn++)); +// if(ret) after_hn--; +// +// ret = lttv_trace_find_hook(ts->parent.t, +// LTT_FACILITY_FS, LTT_EVENT_EXEC, +// 0, 0, 0, +// after_fs_exec_hook, +// events_request, +// &g_array_index(hooks, LttvTraceHook, after_hn++)); +// if(ret) after_hn--; +// +// ret = lttv_trace_find_hook(ts->parent.t, +// LTT_FACILITY_USER_GENERIC, LTT_EVENT_THREAD_BRAND, +// LTT_FIELD_NAME, 0, 0, +// after_user_generic_thread_brand_hook, +// events_request, +// &g_array_index(hooks, LttvTraceHook, after_hn++)); +// if(ret) after_hn--; +// +// ret = lttv_trace_find_hook(ts->parent.t, +// LTT_FACILITY_LIST, LTT_EVENT_PROCESS_STATE, +// LTT_FIELD_PID, LTT_FIELD_PARENT_PID, LTT_FIELD_NAME, +// after_event_enum_process_hook, +// events_request, +// &g_array_index(hooks, LttvTraceHook, after_hn++)); +// if(ret) after_hn--; hooks = g_array_set_size(hooks, after_hn); @@ -526,8 +526,8 @@ void drawing_data_request(Drawing_t *drawing, static void set_last_start(gpointer key, gpointer value, gpointer user_data) { - ProcessInfo *process_info = (ProcessInfo*)key; - HashedProcessData *hashed_process_data = (HashedProcessData*)value; + ResourceInfo *process_info = (ResourceInfo*)key; + HashedResourceData *hashed_process_data = (HashedResourceData*)value; guint x = (guint)user_data; hashed_process_data->x.over = x; @@ -579,12 +579,12 @@ void drawing_chunk_begin(EventsRequest *events_request, LttvTracesetState *tss) guint nb_trace = lttv_traceset_number(traceset); if(!cfd->process_list->current_hash_data) { - cfd->process_list->current_hash_data = g_new(HashedProcessData**,nb_trace); + cfd->process_list->current_hash_data = g_new(HashedResourceData**,nb_trace); for(i = 0 ; i < nb_trace ; i++) { guint num_cpu = ltt_trace_get_num_cpu(tss->parent.traces[i]->t); - cfd->process_list->current_hash_data[i] = g_new(HashedProcessData*,num_cpu); + cfd->process_list->current_hash_data[i] = g_new(HashedResourceData*,num_cpu); memset(cfd->process_list->current_hash_data[i], 0, - sizeof(HashedProcessData*)*num_cpu); + sizeof(HashedResourceData*)*num_cpu); } } //cfd->drawing->last_start = LTT_TIME_MIN(current_time, diff --git a/ltt/branches/poly/lttv/modules/gui/resourceview/eventhooks.c b/ltt/branches/poly/lttv/modules/gui/resourceview/eventhooks.c index 953a9289..f6048720 100644 --- a/ltt/branches/poly/lttv/modules/gui/resourceview/eventhooks.c +++ b/ltt/branches/poly/lttv/modules/gui/resourceview/eventhooks.c @@ -185,12 +185,12 @@ static void request_background_data(ControlFlowData *control_flow_data) * @return The widget created. */ GtkWidget * -h_guicontrolflow(LttvPlugin *plugin) +h_resourceview(LttvPlugin *plugin) { LttvPluginTab *ptab = LTTV_PLUGIN_TAB(plugin); Tab *tab = ptab->tab; g_info("h_guicontrolflow, %p", tab); - ControlFlowData *control_flow_data = guicontrolflow(ptab); + ControlFlowData *control_flow_data = resourceview(ptab); control_flow_data->tab = tab; @@ -277,7 +277,6 @@ static inline PropertiesLine prepare_s_e_line(LttvProcessState *process) prop_line.line_width = STATE_LINE_WIDTH; prop_line.style = GDK_LINE_SOLID; prop_line.y = MIDDLE; - //GdkColormap *colormap = gdk_colormap_get_system(); if(process->state->s == LTTV_STATE_RUN) { if(process->state->t == LTTV_STATE_USER_MODE) @@ -355,6 +354,9 @@ int before_schedchange_hook(void *hook_data, void *call_data) LttTime evtime = ltt_event_time(e); LttvFilter *filter = control_flow_data->filter; + gchar *cpustr; + GQuark cpuq; + /* 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 * time to do it. @@ -362,17 +364,19 @@ int before_schedchange_hook(void *hook_data, void *call_data) guint pid_out; guint pid_in; - { - pid_out = ltt_event_get_long_unsigned(e, thf->f1); - pid_in = ltt_event_get_long_unsigned(e, thf->f2); + pid_out = ltt_event_get_long_unsigned(e, thf->f1); + pid_in = ltt_event_get_long_unsigned(e, thf->f2); + if(pid_in != 0 && pid_out != 0) { + /* not a transition to/from idle */ + return 0; } g_debug("a"); tfc->target_pid = pid_out; - if(!filter || !filter->head || - lttv_filter_tree_parse(filter->head,e,tfc->tf, - tfc->t_context->t,tfc,NULL,NULL)) { +// if(!filter || !filter->head || +// lttv_filter_tree_parse(filter->head,e,tfc->tf, +// tfc->t_context->t,tfc,NULL,NULL)) { /* 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 @@ -380,33 +384,38 @@ 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; + cpustr = g_strdup_printf("CPU%u", cpu); + cpuq = g_quark_from_string(cpustr); + g_free(cpustr); + guint trace_num = ts->parent.index; - LttvProcessState *process = ts->running_process[cpu]; +// LttvProcessState *process = ts->running_process[cpu]; /* unknown state, bad current pid */ - if(process->pid != pid_out) - process = lttv_state_find_process(ts, - tfs->cpu, pid_out); +// if(process->pid != pid_out) +// process = lttv_state_find_process(ts, +// tfs->cpu, pid_out); - if(process != NULL) { +// if(process != NULL) { /* Well, the process_out existed : we must get it in the process hash * or add it, and draw its items. */ /* Add process to process list (if not present) */ guint pl_height = 0; - HashedProcessData *hashed_process_data = NULL; + HashedResourceData *hashed_process_data = NULL; ProcessList *process_list = control_flow_data->process_list; - LttTime birth = process->creation_time; +// LttTime birth = process->creation_time; - hashed_process_data = processlist_get_process_data(process_list, - pid_out, - process->cpu, - &birth, - trace_num); + hashed_process_data = processlist_get_process_data(process_list, cpuq, trace_num); +// hashed_process_data = processlist_get_process_data(process_list, +// pid_out, +// process->cpu, +// &birth, +// trace_num); if(hashed_process_data == NULL) { - g_assert(pid_out == 0 || pid_out != process->ppid); +// g_assert(pid_out == 0 || pid_out != process->ppid); /* Process not present */ - ProcessInfo *process_info; + ResourceInfo *process_info; Drawing_t *drawing = control_flow_data->drawing; resourcelist_add(process_list, drawing, @@ -415,8 +424,8 @@ int before_schedchange_hook(void *hook_data, void *call_data) // process->cpu, // process->ppid, // &birth, -// trace_num, - process->name, + trace_num, + cpuq, //process->name, // process->brand, &pl_height, &process_info, @@ -517,176 +526,21 @@ int before_schedchange_hook(void *hook_data, void *call_data) { /* Draw the line */ - PropertiesLine prop_line = prepare_s_e_line(process); - draw_line((void*)&prop_line, (void*)&draw_context); - - } - /* become the last x position */ - hashed_process_data->x.middle = x; - hashed_process_data->x.middle_used = TRUE; - hashed_process_data->x.middle_marked = FALSE; - - /* Calculate the next good time */ - convert_pixels_to_time(width, x+1, time_window, - &hashed_process_data->next_good_time); - } - } - } - } - - 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)) { - /* 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 - * draw items from the beginning of the read for it. If it is not - * present, it's a new process and it was not present : it will - * be added after the state update. */ - 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 - * or add it, and draw its items. - */ - /* Add process to process list (if not present) */ - guint pl_height = 0; - HashedProcessData *hashed_process_data = NULL; - ProcessList *process_list = control_flow_data->process_list; - LttTime birth = process->creation_time; - - hashed_process_data = processlist_get_process_data(process_list, - pid_in, - tfs->cpu, - &birth, - trace_num); - if(hashed_process_data == NULL) - { - g_assert(pid_in == 0 || pid_in != process->ppid); - /* Process not present */ - ProcessInfo *process_info; - Drawing_t *drawing = control_flow_data->drawing; - processlist_add(process_list, - drawing, - pid_in, - process->tgid, - tfs->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); - - } - //We could set the current process and hash here, but will be done - //by after schedchange hook - - /* Now, the process is in the state hash and our own process hash. - * We definitely can draw the items related to the ending state. - */ - - if(ltt_time_compare(hashed_process_data->next_good_time, - evtime) > 0) - { - if(hashed_process_data->x.middle_marked == FALSE) { - - 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; -#endif //EXTRA_CHECK - Drawing_t *drawing = control_flow_data->drawing; - guint width = drawing->width; - guint x; - convert_time_to_pixels( - time_window, - evtime, - width, - &x); - - /* Draw collision indicator */ - gdk_gc_set_foreground(drawing->gc, &drawing_colors[COL_WHITE]); - gdk_draw_point(hashed_process_data->pixmap, - drawing->gc, - x, - COLLISION_POSITION(hashed_process_data->height)); - hashed_process_data->x.middle_marked = TRUE; - } - } else { - 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; -#endif //EXTRA_CHECK - Drawing_t *drawing = control_flow_data->drawing; - guint width = drawing->width; - guint x; - - convert_time_to_pixels( - time_window, - evtime, - width, - &x); - - - /* Jump over draw if we are at the same x position */ - if(x == hashed_process_data->x.middle && - hashed_process_data->x.middle_used) - { - if(hashed_process_data->x.middle_marked == FALSE) { - /* Draw collision indicator */ - gdk_gc_set_foreground(drawing->gc, &drawing_colors[COL_WHITE]); - gdk_draw_point(hashed_process_data->pixmap, - drawing->gc, - x, - COLLISION_POSITION(hashed_process_data->height)); - hashed_process_data->x.middle_marked = TRUE; - } - /* jump */ - } else { - DrawContext draw_context; - - /* Now create the drawing context that will be used to draw - * items related to the last state. */ - draw_context.drawable = hashed_process_data->pixmap; - draw_context.gc = drawing->gc; - draw_context.pango_layout = drawing->pango_layout; - draw_context.drawinfo.start.x = hashed_process_data->x.middle; - draw_context.drawinfo.end.x = x; - - draw_context.drawinfo.y.over = 1; - draw_context.drawinfo.y.middle = (hashed_process_data->height/2); - draw_context.drawinfo.y.under = hashed_process_data->height; + //PropertiesLine prop_line = prepare_s_e_line(process); + PropertiesLine prop_line; + prop_line.line_width = STATE_LINE_WIDTH; + prop_line.style = GDK_LINE_SOLID; + prop_line.y = MIDDLE; + if(pid_out == 0) + //prop_line.color = { 0, 0xCCCC, 0xCCCC, 0xCCCC }; /* gray */ + prop_line.color = drawing_colors[COL_WHITE]; + else + //prop_line.color = { 0, 0x0000, 0x0000, 0xFFFF }; /* blue */ + prop_line.color = drawing_colors[COL_EXIT]; - draw_context.drawinfo.start.offset.over = 0; - draw_context.drawinfo.start.offset.middle = 0; - draw_context.drawinfo.start.offset.under = 0; - draw_context.drawinfo.end.offset.over = 0; - draw_context.drawinfo.end.offset.middle = 0; - draw_context.drawinfo.end.offset.under = 0; - - { - /* Draw the line */ - PropertiesLine prop_line = prepare_s_e_line(process); draw_line((void*)&prop_line, (void*)&draw_context); - } - + } /* become the last x position */ hashed_process_data->x.middle = x; hashed_process_data->x.middle_used = TRUE; @@ -697,1193 +551,937 @@ int before_schedchange_hook(void *hook_data, void *call_data) &hashed_process_data->next_good_time); } } - } else - g_warning("Cannot find pin_in in schedchange %u", pid_in); - } - tfc->target_pid = target_pid_saved; - return 0; - - - - - /* Text dump */ -#ifdef DONTSHOW - GString *string = g_string_new("");; - gboolean field_names = TRUE, state = TRUE; - - lttv_event_to_string(e, tfc->tf, string, TRUE, field_names, tfs); - g_string_append_printf(string,"\n"); - - if(state) { - g_string_append_printf(string, " %s", - g_quark_to_string(tfs->process->state->s)); - } - - g_info("%s",string->str); - - g_string_free(string, TRUE); - - /* End of text dump */ -#endif //DONTSHOW - -} - -/* after_schedchange_hook - * - * The draw after hook is called by the reading API to have a - * particular event drawn on the screen. - * @param hook_data ControlFlowData structure of the viewer. - * @param call_data Event context. - * - * This function adds items to be drawn in a queue for each process. - * - */ -int after_schedchange_hook(void *hook_data, void *call_data) -{ - LttvTraceHookByFacility *thf = (LttvTraceHookByFacility*)hook_data; - EventsRequest *events_request = (EventsRequest*)thf->hook_data; - ControlFlowData *control_flow_data = events_request->viewer_data; - - LttvTracefileContext *tfc = (LttvTracefileContext *)call_data; - - LttvTracefileState *tfs = (LttvTracefileState *)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,NULL,NULL)) - return FALSE; - - LttTime evtime = ltt_event_time(e); - - /* Add process to process list (if not present) */ - LttvProcessState *process_in; - LttTime birth; - guint pl_height = 0; - HashedProcessData *hashed_process_data_in = NULL; - - ProcessList *process_list = control_flow_data->process_list; - - guint pid_in; - { - guint pid_out; - pid_out = ltt_event_get_long_unsigned(e, thf->f1); - pid_in = ltt_event_get_long_unsigned(e, thf->f2); - } - - - /* 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); -#endif //EXTRA_CHECK - 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, - 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; -#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; - } - } +// } +// } + +// 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)) { +// /* 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 +// * draw items from the beginning of the read for it. If it is not +// * present, it's a new process and it was not present : it will +// * be added after the state update. */ +// 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 +// * or add it, and draw its items. +// */ +// /* Add process to process list (if not present) */ +// guint pl_height = 0; +// HashedResourceData *hashed_process_data = NULL; +// ProcessList *process_list = control_flow_data->process_list; +// LttTime birth = process->creation_time; +// +// hashed_process_data = processlist_get_process_data(process_list, cpuq); +//// hashed_process_data = processlist_get_process_data(process_list, +//// pid_in, +//// tfs->cpu, +//// &birth, +//// trace_num); +// if(hashed_process_data == NULL) +// { +// g_assert(pid_in == 0 || pid_in != process->ppid); +// /* Process not present */ +// ResourceInfo *process_info; +// Drawing_t *drawing = control_flow_data->drawing; +// resourcelist_add(process_list, +// drawing, +//// pid_in, +//// process->tgid, +//// tfs->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); +// +// } +// //We could set the current process and hash here, but will be done +// //by after schedchange hook +// +// /* Now, the process is in the state hash and our own process hash. +// * We definitely can draw the items related to the ending state. +// */ +// +// if(ltt_time_compare(hashed_process_data->next_good_time, +// evtime) > 0) +// { +// if(hashed_process_data->x.middle_marked == FALSE) { +// +// 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; +//#endif //EXTRA_CHECK +// Drawing_t *drawing = control_flow_data->drawing; +// guint width = drawing->width; +// guint x; +// convert_time_to_pixels( +// time_window, +// evtime, +// width, +// &x); +// +// /* Draw collision indicator */ +// gdk_gc_set_foreground(drawing->gc, &drawing_colors[COL_WHITE]); +// gdk_draw_point(hashed_process_data->pixmap, +// drawing->gc, +// x, +// COLLISION_POSITION(hashed_process_data->height)); +// hashed_process_data->x.middle_marked = TRUE; +// } +// } else { +// 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; +//#endif //EXTRA_CHECK +// Drawing_t *drawing = control_flow_data->drawing; +// guint width = drawing->width; +// guint x; +// +// convert_time_to_pixels( +// time_window, +// evtime, +// width, +// &x); +// +// +// /* Jump over draw if we are at the same x position */ +// if(x == hashed_process_data->x.middle && +// hashed_process_data->x.middle_used) +// { +// if(hashed_process_data->x.middle_marked == FALSE) { +// /* Draw collision indicator */ +// gdk_gc_set_foreground(drawing->gc, &drawing_colors[COL_WHITE]); +// gdk_draw_point(hashed_process_data->pixmap, +// drawing->gc, +// x, +// COLLISION_POSITION(hashed_process_data->height)); +// hashed_process_data->x.middle_marked = TRUE; +// } +// /* jump */ +// } else { +// DrawContext draw_context; +// +// /* Now create the drawing context that will be used to draw +// * items related to the last state. */ +// draw_context.drawable = hashed_process_data->pixmap; +// draw_context.gc = drawing->gc; +// draw_context.pango_layout = drawing->pango_layout; +// draw_context.drawinfo.start.x = hashed_process_data->x.middle; +// draw_context.drawinfo.end.x = x; +// +// draw_context.drawinfo.y.over = 1; +// draw_context.drawinfo.y.middle = (hashed_process_data->height/2); +// draw_context.drawinfo.y.under = hashed_process_data->height; +// +// draw_context.drawinfo.start.offset.over = 0; +// draw_context.drawinfo.start.offset.middle = 0; +// draw_context.drawinfo.start.offset.under = 0; +// draw_context.drawinfo.end.offset.over = 0; +// draw_context.drawinfo.end.offset.middle = 0; +// draw_context.drawinfo.end.offset.under = 0; +// +// { +// /* Draw the line */ +// PropertiesLine prop_line = prepare_s_e_line(process); +// draw_line((void*)&prop_line, (void*)&draw_context); +// } +// +// +// /* become the last x position */ +// hashed_process_data->x.middle = x; +// hashed_process_data->x.middle_used = TRUE; +// hashed_process_data->x.middle_marked = FALSE; +// +// /* Calculate the next good time */ +// convert_pixels_to_time(width, x+1, time_window, +// &hashed_process_data->next_good_time); +// } +// } +// } else +// g_warning("Cannot find pin_in in schedchange %u", pid_in); +// } +// tfc->target_pid = target_pid_saved; return 0; -} - - - - -/* before_execmode_hook - * - * This function basically draw lines and icons. Two types of lines are drawn : - * one small (3 pixels?) representing the state of the process and the second - * type is thicker (10 pixels?) representing on which CPU a process is running - * (and this only in running state). - * - * Extremums of the lines : - * x_min : time of the last event context for this process kept in memory. - * x_max : time of the current event. - * y : middle of the process in the process list. The process is found in the - * list, therefore is it's position in pixels. - * - * The choice of lines'color is defined by the context of the last event for this - * process. - */ - - -int before_execmode_hook(void *hook_data, void *call_data) -{ - LttvTraceHookByFacility *thf = (LttvTraceHookByFacility*)hook_data; - EventsRequest *events_request = (EventsRequest*)thf->hook_data; - ControlFlowData *control_flow_data = events_request->viewer_data; - - LttvTracefileContext *tfc = (LttvTracefileContext *)call_data; - - LttvTracefileState *tfs = (LttvTracefileState *)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,NULL,NULL)) - return FALSE; - - LttTime evtime = ltt_event_time(e); - - /* we are in a execmode, before the state update. We must draw the - * items corresponding to the state before it changes : now is the right - * time to do it. - */ - /* 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); - - guint pid = process->pid; - - /* Well, the process_out existed : we must get it in the process hash - * or add it, and draw its items. - */ - /* Add process to process list (if not present) */ - guint pl_height = 0; - HashedProcessData *hashed_process_data = NULL; - ProcessList *process_list = control_flow_data->process_list; - LttTime birth = process->creation_time; - - 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, - trace_num); - if(unlikely(hashed_process_data == NULL)) - { - g_assert(pid == 0 || pid != process->ppid); - ProcessInfo *process_info; - /* Process not present */ - Drawing_t *drawing = control_flow_data->drawing; - 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); - } - /* Set the current process */ - process_list->current_hash_data[trace_num][process->cpu] = - hashed_process_data; - } - - /* Now, the process is in the state hash and our own process hash. - * We definitely can draw the items related to the ending state. - */ - - if(likely(ltt_time_compare(hashed_process_data->next_good_time, - evtime) > 0)) - { - if(unlikely(hashed_process_data->x.middle_marked == FALSE)) { - 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; -#endif //EXTRA_CHECK - Drawing_t *drawing = control_flow_data->drawing; - guint width = drawing->width; - guint x; - convert_time_to_pixels( - time_window, - evtime, - width, - &x); - - /* Draw collision indicator */ - gdk_gc_set_foreground(drawing->gc, &drawing_colors[COL_WHITE]); - gdk_draw_point(hashed_process_data->pixmap, - drawing->gc, - x, - COLLISION_POSITION(hashed_process_data->height)); - hashed_process_data->x.middle_marked = TRUE; - } - } else { - 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; -#endif //EXTRA_CHECK - Drawing_t *drawing = control_flow_data->drawing; - guint width = drawing->width; - guint x; - - convert_time_to_pixels( - time_window, - evtime, - width, - &x); - - - /* Jump over draw if we are at the same x position */ - if(unlikely(x == hashed_process_data->x.middle && - hashed_process_data->x.middle_used)) - { - if(unlikely(hashed_process_data->x.middle_marked == FALSE)) { - /* Draw collision indicator */ - gdk_gc_set_foreground(drawing->gc, &drawing_colors[COL_WHITE]); - gdk_draw_point(hashed_process_data->pixmap, - drawing->gc, - x, - COLLISION_POSITION(hashed_process_data->height)); - hashed_process_data->x.middle_marked = TRUE; - } - /* jump */ - } else { - - DrawContext draw_context; - /* Now create the drawing context that will be used to draw - * items related to the last state. */ - draw_context.drawable = hashed_process_data->pixmap; - draw_context.gc = drawing->gc; - draw_context.pango_layout = drawing->pango_layout; - draw_context.drawinfo.start.x = hashed_process_data->x.middle; - draw_context.drawinfo.end.x = x; - - draw_context.drawinfo.y.over = 1; - draw_context.drawinfo.y.middle = (hashed_process_data->height/2); - draw_context.drawinfo.y.under = hashed_process_data->height; - - draw_context.drawinfo.start.offset.over = 0; - draw_context.drawinfo.start.offset.middle = 0; - draw_context.drawinfo.start.offset.under = 0; - draw_context.drawinfo.end.offset.over = 0; - draw_context.drawinfo.end.offset.middle = 0; - draw_context.drawinfo.end.offset.under = 0; - - { - /* Draw the line */ - PropertiesLine prop_line = prepare_s_e_line(process); - draw_line((void*)&prop_line, (void*)&draw_context); - - } - /* become the last x position */ - hashed_process_data->x.middle = x; - hashed_process_data->x.middle_used = TRUE; - hashed_process_data->x.middle_marked = FALSE; - - /* Calculate the next good time */ - convert_pixels_to_time(width, x+1, time_window, - &hashed_process_data->next_good_time); - } - } - - return 0; -} - -/* before_process_exit_hook - * - * Draw lines for process event. - * - * @param hook_data ControlFlowData structure of the viewer. - * @param call_data Event context. - * - * This function adds items to be drawn in a queue for each process. - * - */ - - -int before_process_exit_hook(void *hook_data, void *call_data) -{ - LttvTraceHookByFacility *thf = (LttvTraceHookByFacility*)hook_data; - EventsRequest *events_request = (EventsRequest*)thf->hook_data; - - ControlFlowData *control_flow_data = events_request->viewer_data; - - LttvTracefileContext *tfc = (LttvTracefileContext *)call_data; - - LttvTracefileState *tfs = (LttvTracefileState *)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,NULL,NULL)) - 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; - guint pl_height = 0; - HashedProcessData *hashed_process_data = NULL; - - ProcessList *process_list = control_flow_data->process_list; - - g_assert(process != NULL); - - birth = process->creation_time; - - 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, - 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); - } - } - - /* Now, the process is in the state hash and our own process hash. - * We definitely can draw the items related to the ending state. - */ - - if(likely(ltt_time_compare(hashed_process_data->next_good_time, - evtime) > 0)) - { - if(unlikely(hashed_process_data->x.middle_marked == FALSE)) { - 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; -#endif //EXTRA_CHECK - Drawing_t *drawing = control_flow_data->drawing; - guint width = drawing->width; - guint x; - convert_time_to_pixels( - time_window, - evtime, - width, - &x); - - /* Draw collision indicator */ - gdk_gc_set_foreground(drawing->gc, &drawing_colors[COL_WHITE]); - gdk_draw_point(hashed_process_data->pixmap, - drawing->gc, - x, - COLLISION_POSITION(hashed_process_data->height)); - hashed_process_data->x.middle_marked = TRUE; - } - } else { - 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; -#endif //EXTRA_CHECK - Drawing_t *drawing = control_flow_data->drawing; - guint width = drawing->width; - guint x; - - convert_time_to_pixels( - time_window, - evtime, - width, - &x); - - - /* Jump over draw if we are at the same x position */ - if(unlikely(x == hashed_process_data->x.middle && - hashed_process_data->x.middle_used)) - { - if(unlikely(hashed_process_data->x.middle_marked == FALSE)) { - /* Draw collision indicator */ - gdk_gc_set_foreground(drawing->gc, &drawing_colors[COL_WHITE]); - gdk_draw_point(hashed_process_data->pixmap, - drawing->gc, - x, - COLLISION_POSITION(hashed_process_data->height)); - hashed_process_data->x.middle_marked = TRUE; - } - /* jump */ - } else { - DrawContext draw_context; - - /* Now create the drawing context that will be used to draw - * items related to the last state. */ - draw_context.drawable = hashed_process_data->pixmap; - draw_context.gc = drawing->gc; - draw_context.pango_layout = drawing->pango_layout; - draw_context.drawinfo.start.x = hashed_process_data->x.middle; - draw_context.drawinfo.end.x = x; - - draw_context.drawinfo.y.over = 1; - draw_context.drawinfo.y.middle = (hashed_process_data->height/2); - draw_context.drawinfo.y.under = hashed_process_data->height; - - draw_context.drawinfo.start.offset.over = 0; - draw_context.drawinfo.start.offset.middle = 0; - draw_context.drawinfo.start.offset.under = 0; - draw_context.drawinfo.end.offset.over = 0; - draw_context.drawinfo.end.offset.middle = 0; - draw_context.drawinfo.end.offset.under = 0; - - { - /* Draw the line */ - PropertiesLine prop_line = prepare_s_e_line(process); - draw_line((void*)&prop_line, (void*)&draw_context); - - } - /* become the last x position */ - hashed_process_data->x.middle = x; - hashed_process_data->x.middle_used = TRUE; - hashed_process_data->x.middle_marked = FALSE; - - /* Calculate the next good time */ - convert_pixels_to_time(width, x+1, time_window, - &hashed_process_data->next_good_time); - } - } - - return 0; - -} - - - -/* before_process_release_hook - * - * Draw lines for process event. - * - * @param hook_data ControlFlowData structure of the viewer. - * @param call_data Event context. - * - * This function adds items to be drawn in a queue for each process. - * - */ - - -int before_process_release_hook(void *hook_data, void *call_data) -{ - LttvTraceHookByFacility *thf = (LttvTraceHookByFacility*)hook_data; - EventsRequest *events_request = (EventsRequest*)thf->hook_data; - - ControlFlowData *control_flow_data = events_request->viewer_data; - - LttvTracefileContext *tfc = (LttvTracefileContext *)call_data; - - LttvTracefileState *tfs = (LttvTracefileState *)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,NULL,NULL)) - return FALSE; - - LttTime evtime = ltt_event_time(e); - - guint trace_num = ts->parent.index; - - guint pid; - { - pid = ltt_event_get_long_unsigned(e, thf->f1); - } - - /* Add process to process list (if not present) */ - /* Don't care about the process if it's not in the state hash already : - * that means a process that has never done anything in the trace and - * unknown suddently gets destroyed : no state meaningful to show. */ - LttvProcessState *process = lttv_state_find_process(ts, ANY_CPU, pid); - - if(process != NULL) { - LttTime birth; - guint pl_height = 0; - HashedProcessData *hashed_process_data = NULL; - - ProcessList *process_list = control_flow_data->process_list; - - birth = process->creation_time; - - /* Cannot use current process : this event happens on another process, - * action done by the parent. */ - hashed_process_data = processlist_get_process_data(process_list, - pid, - process->cpu, - &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); - } - - /* Now, the process is in the state hash and our own process hash. - * We definitely can draw the items related to the ending state. - */ - - if(likely(ltt_time_compare(hashed_process_data->next_good_time, - evtime) > 0)) - { - if(unlikely(hashed_process_data->x.middle_marked == FALSE)) { - 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; -#endif //EXTRA_CHECK - Drawing_t *drawing = control_flow_data->drawing; - guint width = drawing->width; - guint x; - convert_time_to_pixels( - time_window, - evtime, - width, - &x); - - /* Draw collision indicator */ - gdk_gc_set_foreground(drawing->gc, &drawing_colors[COL_WHITE]); - gdk_draw_point(hashed_process_data->pixmap, - drawing->gc, - x, - COLLISION_POSITION(hashed_process_data->height)); - hashed_process_data->x.middle_marked = TRUE; - } - } else { - 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; -#endif //EXTRA_CHECK - Drawing_t *drawing = control_flow_data->drawing; - guint width = drawing->width; - guint x; - - convert_time_to_pixels( - time_window, - evtime, - width, - &x); - - - /* Jump over draw if we are at the same x position */ - if(unlikely(x == hashed_process_data->x.middle && - hashed_process_data->x.middle_used)) - { - if(unlikely(hashed_process_data->x.middle_marked == FALSE)) { - /* Draw collision indicator */ - gdk_gc_set_foreground(drawing->gc, &drawing_colors[COL_WHITE]); - gdk_draw_point(hashed_process_data->pixmap, - drawing->gc, - x, - COLLISION_POSITION(hashed_process_data->height)); - hashed_process_data->x.middle_marked = TRUE; - } - /* jump */ - } else { - DrawContext draw_context; - - /* Now create the drawing context that will be used to draw - * items related to the last state. */ - draw_context.drawable = hashed_process_data->pixmap; - draw_context.gc = drawing->gc; - draw_context.pango_layout = drawing->pango_layout; - draw_context.drawinfo.start.x = hashed_process_data->x.middle; - draw_context.drawinfo.end.x = x; - - draw_context.drawinfo.y.over = 1; - draw_context.drawinfo.y.middle = (hashed_process_data->height/2); - draw_context.drawinfo.y.under = hashed_process_data->height; - - draw_context.drawinfo.start.offset.over = 0; - draw_context.drawinfo.start.offset.middle = 0; - draw_context.drawinfo.start.offset.under = 0; - draw_context.drawinfo.end.offset.over = 0; - draw_context.drawinfo.end.offset.middle = 0; - draw_context.drawinfo.end.offset.under = 0; - - { - /* Draw the line */ - PropertiesLine prop_line = prepare_s_e_line(process); - draw_line((void*)&prop_line, (void*)&draw_context); - - } - /* become the last x position */ - hashed_process_data->x.middle = x; - hashed_process_data->x.middle_used = TRUE; - hashed_process_data->x.middle_marked = FALSE; - - /* Calculate the next good time */ - convert_pixels_to_time(width, x+1, time_window, - &hashed_process_data->next_good_time); - } - } - } - - return 0; -} - - - - - -/* after_process_fork_hook - * - * Create the processlist entry for the child process. Put the last - * position in x at the current time value. - * - * @param hook_data ControlFlowData structure of the viewer. - * @param call_data Event context. - * - * This function adds items to be drawn in a queue for each process. - * - */ -int after_process_fork_hook(void *hook_data, void *call_data) -{ - LttvTraceHookByFacility *thf = (LttvTraceHookByFacility*)hook_data; - EventsRequest *events_request = (EventsRequest*)thf->hook_data; - ControlFlowData *control_flow_data = events_request->viewer_data; - - LttvTracefileContext *tfc = (LttvTracefileContext *)call_data; - - LttvTracefileState *tfs = (LttvTracefileState *)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,NULL,NULL)) - return FALSE; - - LttTime evtime = ltt_event_time(e); - - guint child_pid; - { - child_pid = ltt_event_get_long_unsigned(e, thf->f2); - } - - /* Add process to process list (if not present) */ - LttvProcessState *process_child; - LttTime birth; - guint pl_height = 0; - HashedProcessData *hashed_process_data_child = NULL; - - ProcessList *process_list = control_flow_data->process_list; - - /* Find child in the list... */ - process_child = lttv_state_find_process(ts, ANY_CPU, child_pid); - /* It should exist, because we are after the state update. */ - 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. */ - hashed_process_data_child = processlist_get_process_data(process_list, - child_pid, - process_child->cpu, - &birth, - trace_num); - if(likely(hashed_process_data_child == NULL)) - { - g_assert(child_pid == 0 || child_pid != process_child->ppid); - /* Process not present */ - Drawing_t *drawing = control_flow_data->drawing; - ProcessInfo *process_info; - processlist_add(process_list, - drawing, - child_pid, - process_child->tgid, - process_child->cpu, - process_child->ppid, - &birth, - trace_num, - process_child->name, - process_child->brand, - &pl_height, - &process_info, - &hashed_process_data_child); - gtk_widget_set_size_request(drawing->drawing_area, - -1, - pl_height); - gtk_widget_queue_draw(drawing->drawing_area); - } else { - processlist_set_ppid(process_list, process_child->ppid, - hashed_process_data_child); - processlist_set_tgid(process_list, process_child->tgid, - hashed_process_data_child); - } - - - if(likely(ltt_time_compare(hashed_process_data_child->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; -#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(likely(hashed_process_data_child->x.over != new_x)) { - hashed_process_data_child->x.over = new_x; - hashed_process_data_child->x.over_used = FALSE; - hashed_process_data_child->x.over_marked = FALSE; - } - if(likely(hashed_process_data_child->x.middle != new_x)) { - hashed_process_data_child->x.middle = new_x; - hashed_process_data_child->x.middle_used = FALSE; - hashed_process_data_child->x.middle_marked = FALSE; - } - if(likely(hashed_process_data_child->x.under != new_x)) { - hashed_process_data_child->x.under = new_x; - hashed_process_data_child->x.under_used = FALSE; - hashed_process_data_child->x.under_marked = FALSE; - } - } - return 0; -} - - - -/* after_process_exit_hook - * - * Create the processlist entry for the child process. Put the last - * position in x at the current time value. - * - * @param hook_data ControlFlowData structure of the viewer. - * @param call_data Event context. - * - * This function adds items to be drawn in a queue for each process. - * - */ -int after_process_exit_hook(void *hook_data, void *call_data) -{ - LttvTraceHookByFacility *thf = (LttvTraceHookByFacility*)hook_data; - EventsRequest *events_request = (EventsRequest*)thf->hook_data; - ControlFlowData *control_flow_data = events_request->viewer_data; - - LttvTracefileContext *tfc = (LttvTracefileContext *)call_data; - - LttvTracefileState *tfs = (LttvTracefileState *)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,NULL,NULL)) - 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. */ - g_assert(process != NULL); - - guint pid = process->pid; - LttTime birth; - guint pl_height = 0; - HashedProcessData *hashed_process_data = NULL; - - ProcessList *process_list = control_flow_data->process_list; - - birth = process->creation_time; - - 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, - 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); - } - - /* Set the current process */ - process_list->current_hash_data[trace_num][process->cpu] = - hashed_process_data; - } - - if(unlikely(ltt_time_compare(hashed_process_data->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; -#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(unlikely(hashed_process_data->x.middle != new_x)) { - hashed_process_data->x.middle = new_x; - hashed_process_data->x.middle_used = FALSE; - hashed_process_data->x.middle_marked = FALSE; - } - } - - return 0; -} - - -/* Get the filename of the process to print */ -int after_fs_exec_hook(void *hook_data, void *call_data) -{ - LttvTraceHookByFacility *thf = (LttvTraceHookByFacility*)hook_data; - EventsRequest *events_request = (EventsRequest*)thf->hook_data; - ControlFlowData *control_flow_data = events_request->viewer_data; - - LttvTracefileContext *tfc = (LttvTracefileContext *)call_data; - - LttvTracefileState *tfs = (LttvTracefileState *)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,NULL,NULL)) - return FALSE; - - guint cpu = tfs->cpu; - guint trace_num = ts->parent.index; - LttvProcessState *process = ts->running_process[cpu]; - g_assert(process != NULL); - - guint pid = process->pid; - - /* Well, the process_out existed : we must get it in the process hash - * or add it, and draw its items. - */ - /* Add process to process list (if not present) */ - guint pl_height = 0; - HashedProcessData *hashed_process_data = NULL; - ProcessList *process_list = control_flow_data->process_list; - LttTime birth = process->creation_time; - - 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, - trace_num); - if(unlikely(hashed_process_data == NULL)) - { - g_assert(pid == 0 || pid != process->ppid); - ProcessInfo *process_info; - /* Process not present */ - Drawing_t *drawing = control_flow_data->drawing; - 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); - } - /* Set the current process */ - process_list->current_hash_data[trace_num][process->cpu] = - hashed_process_data; - } - processlist_set_name(process_list, process->name, hashed_process_data); - return 0; -} -/* Get the filename of the process to print */ -int after_user_generic_thread_brand_hook(void *hook_data, void *call_data) -{ - LttvTraceHookByFacility *thf = (LttvTraceHookByFacility*)hook_data; - EventsRequest *events_request = (EventsRequest*)thf->hook_data; - ControlFlowData *control_flow_data = events_request->viewer_data; + /* Text dump */ +#ifdef DONTSHOW + GString *string = g_string_new("");; + gboolean field_names = TRUE, state = TRUE; - LttvTracefileContext *tfc = (LttvTracefileContext *)call_data; + lttv_event_to_string(e, tfc->tf, string, TRUE, field_names, tfs); + g_string_append_printf(string,"\n"); - LttvTracefileState *tfs = (LttvTracefileState *)call_data; + if(state) { + g_string_append_printf(string, " %s", + g_quark_to_string(tfs->process->state->s)); + } - LttvTraceState *ts = (LttvTraceState *)tfc->t_context; + g_info("%s",string->str); - LttEvent *e; - e = ltt_tracefile_get_event(tfc->tf); + g_string_free(string, TRUE); + + /* End of text dump */ +#endif //DONTSHOW - 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; +} - guint cpu = tfs->cpu; - guint trace_num = ts->parent.index; - LttvProcessState *process = ts->running_process[cpu]; - g_assert(process != NULL); +/* after_schedchange_hook + * + * The draw after hook is called by the reading API to have a + * particular event drawn on the screen. + * @param hook_data ControlFlowData structure of the viewer. + * @param call_data Event context. + * + * This function adds items to be drawn in a queue for each process. + * + */ +int after_schedchange_hook(void *hook_data, void *call_data) +{ +// LttvTraceHookByFacility *thf = (LttvTraceHookByFacility*)hook_data; +// EventsRequest *events_request = (EventsRequest*)thf->hook_data; +// ControlFlowData *control_flow_data = events_request->viewer_data; +// +// LttvTracefileContext *tfc = (LttvTracefileContext *)call_data; +// +// LttvTracefileState *tfs = (LttvTracefileState *)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,NULL,NULL)) +// return FALSE; +// +// LttTime evtime = ltt_event_time(e); +// +// return 0; +// /* Add process to process list (if not present) */ +// LttvProcessState *process_in; +// LttTime birth; +// guint pl_height = 0; +// HashedResourceData *hashed_process_data_in = NULL; +// +// ProcessList *process_list = control_flow_data->process_list; +// +// guint pid_in; +// { +// guint pid_out; +// pid_out = ltt_event_get_long_unsigned(e, thf->f1); +// pid_in = ltt_event_get_long_unsigned(e, thf->f2); +// } +// +// +// /* 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); +//#endif //EXTRA_CHECK +// birth = process_in->creation_time; +// +// hashed_process_data_in = processlist_get_process_data(process_list, cpuq, trace_num); +//// 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); +// ResourceInfo *process_info; +// Drawing_t *drawing = control_flow_data->drawing; +// /* Process not present */ +// resourcelist_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); +// +//#ifdef EXTRA_CHECK +// if(ltt_time_compare(evtime, time_window.start_time) == -1 +// || ltt_time_compare(evtime, time_window.end_time) == 1) +// return; +//#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; +// } +// } + return 0; +} - guint pid = process->pid; +/* before_execmode_hook + * + * This function basically draw lines and icons. Two types of lines are drawn : + * one small (3 pixels?) representing the state of the process and the second + * type is thicker (10 pixels?) representing on which CPU a process is running + * (and this only in running state). + * + * Extremums of the lines : + * x_min : time of the last event context for this process kept in memory. + * x_max : time of the current event. + * y : middle of the process in the process list. The process is found in the + * list, therefore is it's position in pixels. + * + * The choice of lines'color is defined by the context of the last event for this + * process. + */ - /* Well, the process_out existed : we must get it in the process hash - * or add it, and draw its items. - */ - /* Add process to process list (if not present) */ - guint pl_height = 0; - HashedProcessData *hashed_process_data = NULL; - ProcessList *process_list = control_flow_data->process_list; - LttTime birth = process->creation_time; - - 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, - trace_num); - if(unlikely(hashed_process_data == NULL)) - { - g_assert(pid == 0 || pid != process->ppid); - ProcessInfo *process_info; - /* Process not present */ - Drawing_t *drawing = control_flow_data->drawing; - 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); - } - /* Set the current process */ - process_list->current_hash_data[trace_num][process->cpu] = - hashed_process_data; - } +//int before_execmode_hook(void *hook_data, void *call_data) +//{ +// LttvTraceHookByFacility *thf = (LttvTraceHookByFacility*)hook_data; +// EventsRequest *events_request = (EventsRequest*)thf->hook_data; +// ControlFlowData *control_flow_data = events_request->viewer_data; +// +// LttvTracefileContext *tfc = (LttvTracefileContext *)call_data; +// +// LttvTracefileState *tfs = (LttvTracefileState *)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,NULL,NULL)) +// return FALSE; +// +// LttTime evtime = ltt_event_time(e); +// +// /* we are in a execmode, before the state update. We must draw the +// * items corresponding to the state before it changes : now is the right +// * time to do it. +// */ +// /* 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); +// +// guint pid = process->pid; +// +// /* Well, the process_out existed : we must get it in the process hash +// * or add it, and draw its items. +// */ +// /* Add process to process list (if not present) */ +// guint pl_height = 0; +// HashedResourceData *hashed_process_data = NULL; +// ProcessList *process_list = control_flow_data->process_list; +// LttTime birth = process->creation_time; +// +// 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, "CPU0"); +//// hashed_process_data = processlist_get_process_data(process_list, +//// pid, +//// process->cpu, +//// &birth, +//// trace_num); +// if(unlikely(hashed_process_data == NULL)) +// { +// g_assert(pid == 0 || pid != process->ppid); +// ResourceInfo *process_info; +// /* Process not present */ +// Drawing_t *drawing = control_flow_data->drawing; +// 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); +// } +// /* Set the current process */ +// process_list->current_hash_data[trace_num][process->cpu] = +// hashed_process_data; +// } +// +// /* Now, the process is in the state hash and our own process hash. +// * We definitely can draw the items related to the ending state. +// */ +// +// if(likely(ltt_time_compare(hashed_process_data->next_good_time, +// evtime) > 0)) +// { +// if(unlikely(hashed_process_data->x.middle_marked == FALSE)) { +// 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; +//#endif //EXTRA_CHECK +// Drawing_t *drawing = control_flow_data->drawing; +// guint width = drawing->width; +// guint x; +// convert_time_to_pixels( +// time_window, +// evtime, +// width, +// &x); +// +// /* Draw collision indicator */ +// gdk_gc_set_foreground(drawing->gc, &drawing_colors[COL_WHITE]); +// gdk_draw_point(hashed_process_data->pixmap, +// drawing->gc, +// x, +// COLLISION_POSITION(hashed_process_data->height)); +// hashed_process_data->x.middle_marked = TRUE; +// } +// } else { +// 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; +//#endif //EXTRA_CHECK +// Drawing_t *drawing = control_flow_data->drawing; +// guint width = drawing->width; +// guint x; +// +// convert_time_to_pixels( +// time_window, +// evtime, +// width, +// &x); +// +// +// /* Jump over draw if we are at the same x position */ +// if(unlikely(x == hashed_process_data->x.middle && +// hashed_process_data->x.middle_used)) +// { +// if(unlikely(hashed_process_data->x.middle_marked == FALSE)) { +// /* Draw collision indicator */ +// gdk_gc_set_foreground(drawing->gc, &drawing_colors[COL_WHITE]); +// gdk_draw_point(hashed_process_data->pixmap, +// drawing->gc, +// x, +// COLLISION_POSITION(hashed_process_data->height)); +// hashed_process_data->x.middle_marked = TRUE; +// } +// /* jump */ +// } else { +// +// DrawContext draw_context; +// /* Now create the drawing context that will be used to draw +// * items related to the last state. */ +// draw_context.drawable = hashed_process_data->pixmap; +// draw_context.gc = drawing->gc; +// draw_context.pango_layout = drawing->pango_layout; +// draw_context.drawinfo.start.x = hashed_process_data->x.middle; +// draw_context.drawinfo.end.x = x; +// +// draw_context.drawinfo.y.over = 1; +// draw_context.drawinfo.y.middle = (hashed_process_data->height/2); +// draw_context.drawinfo.y.under = hashed_process_data->height; +// +// draw_context.drawinfo.start.offset.over = 0; +// draw_context.drawinfo.start.offset.middle = 0; +// draw_context.drawinfo.start.offset.under = 0; +// draw_context.drawinfo.end.offset.over = 0; +// draw_context.drawinfo.end.offset.middle = 0; +// draw_context.drawinfo.end.offset.under = 0; +// +// { +// /* Draw the line */ +// PropertiesLine prop_line = prepare_s_e_line(process); +// draw_line((void*)&prop_line, (void*)&draw_context); +// +// } +// /* become the last x position */ +// hashed_process_data->x.middle = x; +// hashed_process_data->x.middle_used = TRUE; +// hashed_process_data->x.middle_marked = FALSE; +// +// /* Calculate the next good time */ +// convert_pixels_to_time(width, x+1, time_window, +// &hashed_process_data->next_good_time); +// } +// } +// +// return 0; +//} + +/* before_process_exit_hook + * + * Draw lines for process event. + * + * @param hook_data ControlFlowData structure of the viewer. + * @param call_data Event context. + * + * This function adds items to be drawn in a queue for each process. + * + */ - processlist_set_brand(process_list, process->brand, hashed_process_data); +//int before_process_exit_hook(void *hook_data, void *call_data) +//{ +// LttvTraceHookByFacility *thf = (LttvTraceHookByFacility*)hook_data; +// EventsRequest *events_request = (EventsRequest*)thf->hook_data; +// +// ControlFlowData *control_flow_data = events_request->viewer_data; +// +// LttvTracefileContext *tfc = (LttvTracefileContext *)call_data; +// +// LttvTracefileState *tfs = (LttvTracefileState *)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,NULL,NULL)) +// 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; +// guint pl_height = 0; +// HashedResourceData *hashed_process_data = NULL; +// +// ProcessList *process_list = control_flow_data->process_list; +// +// g_assert(process != NULL); +// +// birth = process->creation_time; +// +// 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, "CPU0"); +//// hashed_process_data = processlist_get_process_data(process_list, +//// pid, +//// process->cpu, +//// &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; +// ResourceInfo *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); +// } +// } +// +// /* Now, the process is in the state hash and our own process hash. +// * We definitely can draw the items related to the ending state. +// */ +// +// if(likely(ltt_time_compare(hashed_process_data->next_good_time, +// evtime) > 0)) +// { +// if(unlikely(hashed_process_data->x.middle_marked == FALSE)) { +// 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; +//#endif //EXTRA_CHECK +// Drawing_t *drawing = control_flow_data->drawing; +// guint width = drawing->width; +// guint x; +// convert_time_to_pixels( +// time_window, +// evtime, +// width, +// &x); +// +// /* Draw collision indicator */ +// gdk_gc_set_foreground(drawing->gc, &drawing_colors[COL_WHITE]); +// gdk_draw_point(hashed_process_data->pixmap, +// drawing->gc, +// x, +// COLLISION_POSITION(hashed_process_data->height)); +// hashed_process_data->x.middle_marked = TRUE; +// } +// } else { +// 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; +//#endif //EXTRA_CHECK +// Drawing_t *drawing = control_flow_data->drawing; +// guint width = drawing->width; +// guint x; +// +// convert_time_to_pixels( +// time_window, +// evtime, +// width, +// &x); +// +// +// /* Jump over draw if we are at the same x position */ +// if(unlikely(x == hashed_process_data->x.middle && +// hashed_process_data->x.middle_used)) +// { +// if(unlikely(hashed_process_data->x.middle_marked == FALSE)) { +// /* Draw collision indicator */ +// gdk_gc_set_foreground(drawing->gc, &drawing_colors[COL_WHITE]); +// gdk_draw_point(hashed_process_data->pixmap, +// drawing->gc, +// x, +// COLLISION_POSITION(hashed_process_data->height)); +// hashed_process_data->x.middle_marked = TRUE; +// } +// /* jump */ +// } else { +// DrawContext draw_context; +// +// /* Now create the drawing context that will be used to draw +// * items related to the last state. */ +// draw_context.drawable = hashed_process_data->pixmap; +// draw_context.gc = drawing->gc; +// draw_context.pango_layout = drawing->pango_layout; +// draw_context.drawinfo.start.x = hashed_process_data->x.middle; +// draw_context.drawinfo.end.x = x; +// +// draw_context.drawinfo.y.over = 1; +// draw_context.drawinfo.y.middle = (hashed_process_data->height/2); +// draw_context.drawinfo.y.under = hashed_process_data->height; +// +// draw_context.drawinfo.start.offset.over = 0; +// draw_context.drawinfo.start.offset.middle = 0; +// draw_context.drawinfo.start.offset.under = 0; +// draw_context.drawinfo.end.offset.over = 0; +// draw_context.drawinfo.end.offset.middle = 0; +// draw_context.drawinfo.end.offset.under = 0; +// +// { +// /* Draw the line */ +// PropertiesLine prop_line = prepare_s_e_line(process); +// draw_line((void*)&prop_line, (void*)&draw_context); +// +// } +// /* become the last x position */ +// hashed_process_data->x.middle = x; +// hashed_process_data->x.middle_used = TRUE; +// hashed_process_data->x.middle_marked = FALSE; +// +// /* Calculate the next good time */ +// convert_pixels_to_time(width, x+1, time_window, +// &hashed_process_data->next_good_time); +// } +// } +// +// return 0; +// +//} - return 0; -} +/* before_process_release_hook + * + * Draw lines for process event. + * + * @param hook_data ControlFlowData structure of the viewer. + * @param call_data Event context. + * + * This function adds items to be drawn in a queue for each process. + * + */ +//int before_process_release_hook(void *hook_data, void *call_data) +//{ +// LttvTraceHookByFacility *thf = (LttvTraceHookByFacility*)hook_data; +// EventsRequest *events_request = (EventsRequest*)thf->hook_data; +// +// ControlFlowData *control_flow_data = events_request->viewer_data; +// +// LttvTracefileContext *tfc = (LttvTracefileContext *)call_data; +// +// LttvTracefileState *tfs = (LttvTracefileState *)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,NULL,NULL)) +// return FALSE; +// +// LttTime evtime = ltt_event_time(e); +// +// guint trace_num = ts->parent.index; +// +// guint pid; +// { +// pid = ltt_event_get_long_unsigned(e, thf->f1); +// } +// +// /* Add process to process list (if not present) */ +// /* Don't care about the process if it's not in the state hash already : +// * that means a process that has never done anything in the trace and +// * unknown suddently gets destroyed : no state meaningful to show. */ +// LttvProcessState *process = lttv_state_find_process(ts, ANY_CPU, pid); +// +// if(process != NULL) { +// LttTime birth; +// guint pl_height = 0; +// HashedResourceData *hashed_process_data = NULL; +// +// ProcessList *process_list = control_flow_data->process_list; +// +// birth = process->creation_time; +// +// /* Cannot use current process : this event happens on another process, +// * action done by the parent. */ +// hashed_process_data = processlist_get_process_data(process_list, "CPU0"); +//// hashed_process_data = processlist_get_process_data(process_list, +//// pid, +//// process->cpu, +//// &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; +// ResourceInfo *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); +// } +// +// /* Now, the process is in the state hash and our own process hash. +// * We definitely can draw the items related to the ending state. +// */ +// +// if(likely(ltt_time_compare(hashed_process_data->next_good_time, +// evtime) > 0)) +// { +// if(unlikely(hashed_process_data->x.middle_marked == FALSE)) { +// 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; +//#endif //EXTRA_CHECK +// Drawing_t *drawing = control_flow_data->drawing; +// guint width = drawing->width; +// guint x; +// convert_time_to_pixels( +// time_window, +// evtime, +// width, +// &x); +// +// /* Draw collision indicator */ +// gdk_gc_set_foreground(drawing->gc, &drawing_colors[COL_WHITE]); +// gdk_draw_point(hashed_process_data->pixmap, +// drawing->gc, +// x, +// COLLISION_POSITION(hashed_process_data->height)); +// hashed_process_data->x.middle_marked = TRUE; +// } +// } else { +// 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; +//#endif //EXTRA_CHECK +// Drawing_t *drawing = control_flow_data->drawing; +// guint width = drawing->width; +// guint x; +// +// convert_time_to_pixels( +// time_window, +// evtime, +// width, +// &x); +// +// +// /* Jump over draw if we are at the same x position */ +// if(unlikely(x == hashed_process_data->x.middle && +// hashed_process_data->x.middle_used)) +// { +// if(unlikely(hashed_process_data->x.middle_marked == FALSE)) { +// /* Draw collision indicator */ +// gdk_gc_set_foreground(drawing->gc, &drawing_colors[COL_WHITE]); +// gdk_draw_point(hashed_process_data->pixmap, +// drawing->gc, +// x, +// COLLISION_POSITION(hashed_process_data->height)); +// hashed_process_data->x.middle_marked = TRUE; +// } +// /* jump */ +// } else { +// DrawContext draw_context; +// +// /* Now create the drawing context that will be used to draw +// * items related to the last state. */ +// draw_context.drawable = hashed_process_data->pixmap; +// draw_context.gc = drawing->gc; +// draw_context.pango_layout = drawing->pango_layout; +// draw_context.drawinfo.start.x = hashed_process_data->x.middle; +// draw_context.drawinfo.end.x = x; +// +// draw_context.drawinfo.y.over = 1; +// draw_context.drawinfo.y.middle = (hashed_process_data->height/2); +// draw_context.drawinfo.y.under = hashed_process_data->height; +// +// draw_context.drawinfo.start.offset.over = 0; +// draw_context.drawinfo.start.offset.middle = 0; +// draw_context.drawinfo.start.offset.under = 0; +// draw_context.drawinfo.end.offset.over = 0; +// draw_context.drawinfo.end.offset.middle = 0; +// draw_context.drawinfo.end.offset.under = 0; +// +// { +// /* Draw the line */ +// PropertiesLine prop_line = prepare_s_e_line(process); +// draw_line((void*)&prop_line, (void*)&draw_context); +// +// } +// /* become the last x position */ +// hashed_process_data->x.middle = x; +// hashed_process_data->x.middle_used = TRUE; +// hashed_process_data->x.middle_marked = FALSE; +// +// /* Calculate the next good time */ +// convert_pixels_to_time(width, x+1, time_window, +// &hashed_process_data->next_good_time); +// } +// } +// } +// +// return 0; +//} -/* after_event_enum_process_hook +/* after_process_fork_hook * * Create the processlist entry for the child process. Put the last * position in x at the current time value. @@ -1894,107 +1492,529 @@ int after_user_generic_thread_brand_hook(void *hook_data, void *call_data) * This function adds items to be drawn in a queue for each process. * */ -int after_event_enum_process_hook(void *hook_data, void *call_data) -{ - LttvTraceHookByFacility *thf = (LttvTraceHookByFacility*)hook_data; - EventsRequest *events_request = (EventsRequest*)thf->hook_data; - ControlFlowData *control_flow_data = events_request->viewer_data; - - LttvTracefileContext *tfc = (LttvTracefileContext *)call_data; - - LttvTracefileState *tfs = (LttvTracefileState *)call_data; +//int after_process_fork_hook(void *hook_data, void *call_data) +//{ +// LttvTraceHookByFacility *thf = (LttvTraceHookByFacility*)hook_data; +// EventsRequest *events_request = (EventsRequest*)thf->hook_data; +// ControlFlowData *control_flow_data = events_request->viewer_data; +// +// LttvTracefileContext *tfc = (LttvTracefileContext *)call_data; +// +// LttvTracefileState *tfs = (LttvTracefileState *)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,NULL,NULL)) +// return FALSE; +// +// LttTime evtime = ltt_event_time(e); +// +// guint child_pid; +// { +// child_pid = ltt_event_get_long_unsigned(e, thf->f2); +// } +// +// /* Add process to process list (if not present) */ +// LttvProcessState *process_child; +// LttTime birth; +// guint pl_height = 0; +// HashedResourceData *hashed_process_data_child = NULL; +// +// ProcessList *process_list = control_flow_data->process_list; +// +// /* Find child in the list... */ +// process_child = lttv_state_find_process(ts, ANY_CPU, child_pid); +// /* It should exist, because we are after the state update. */ +// 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. */ +// hashed_process_data_child = processlist_get_process_data(process_list, "CPU0"); +//// hashed_process_data_child = processlist_get_process_data(process_list, +//// child_pid, +//// process_child->cpu, +//// &birth, +//// trace_num); +// if(likely(hashed_process_data_child == NULL)) +// { +// g_assert(child_pid == 0 || child_pid != process_child->ppid); +// /* Process not present */ +// Drawing_t *drawing = control_flow_data->drawing; +// ResourceInfo *process_info; +// processlist_add(process_list, +// drawing, +// child_pid, +// process_child->tgid, +// process_child->cpu, +// process_child->ppid, +// &birth, +// trace_num, +// process_child->name, +// process_child->brand, +// &pl_height, +// &process_info, +// &hashed_process_data_child); +// gtk_widget_set_size_request(drawing->drawing_area, +// -1, +// pl_height); +// gtk_widget_queue_draw(drawing->drawing_area); +// } else { +// processlist_set_ppid(process_list, process_child->ppid, +// hashed_process_data_child); +// processlist_set_tgid(process_list, process_child->tgid, +// hashed_process_data_child); +// } +// +// +// if(likely(ltt_time_compare(hashed_process_data_child->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; +//#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(likely(hashed_process_data_child->x.over != new_x)) { +// hashed_process_data_child->x.over = new_x; +// hashed_process_data_child->x.over_used = FALSE; +// hashed_process_data_child->x.over_marked = FALSE; +// } +// if(likely(hashed_process_data_child->x.middle != new_x)) { +// hashed_process_data_child->x.middle = new_x; +// hashed_process_data_child->x.middle_used = FALSE; +// hashed_process_data_child->x.middle_marked = FALSE; +// } +// if(likely(hashed_process_data_child->x.under != new_x)) { +// hashed_process_data_child->x.under = new_x; +// hashed_process_data_child->x.under_used = FALSE; +// hashed_process_data_child->x.under_marked = FALSE; +// } +// } +// return 0; +//} - LttvTraceState *ts = (LttvTraceState *)tfc->t_context; - guint first_cpu, nb_cpus, cpu; - LttEvent *e; - e = ltt_tracefile_get_event(tfc->tf); +/* after_process_exit_hook + * + * Create the processlist entry for the child process. Put the last + * position in x at the current time value. + * + * @param hook_data ControlFlowData structure of the viewer. + * @param call_data Event context. + * + * This function adds items to be drawn in a queue for each process. + * + */ +//int after_process_exit_hook(void *hook_data, void *call_data) +//{ +// LttvTraceHookByFacility *thf = (LttvTraceHookByFacility*)hook_data; +// EventsRequest *events_request = (EventsRequest*)thf->hook_data; +// ControlFlowData *control_flow_data = events_request->viewer_data; +// +// LttvTracefileContext *tfc = (LttvTracefileContext *)call_data; +// +// LttvTracefileState *tfs = (LttvTracefileState *)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,NULL,NULL)) +// 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. */ +// g_assert(process != NULL); +// +// guint pid = process->pid; +// LttTime birth; +// guint pl_height = 0; +// HashedResourceData *hashed_process_data = NULL; +// +// ProcessList *process_list = control_flow_data->process_list; +// +// birth = process->creation_time; +// +// 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, "CPU0"); +//// hashed_process_data = processlist_get_process_data(process_list, +//// pid, +//// process->cpu, +//// &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; +// ResourceInfo *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); +// } +// +// /* Set the current process */ +// process_list->current_hash_data[trace_num][process->cpu] = +// hashed_process_data; +// } +// +// if(unlikely(ltt_time_compare(hashed_process_data->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; +//#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(unlikely(hashed_process_data->x.middle != new_x)) { +// hashed_process_data->x.middle = new_x; +// hashed_process_data->x.middle_used = FALSE; +// hashed_process_data->x.middle_marked = FALSE; +// } +// } +// +// return 0; +//} - 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); +/* Get the filename of the process to print */ +//int after_fs_exec_hook(void *hook_data, void *call_data) +//{ +// LttvTraceHookByFacility *thf = (LttvTraceHookByFacility*)hook_data; +// EventsRequest *events_request = (EventsRequest*)thf->hook_data; +// ControlFlowData *control_flow_data = events_request->viewer_data; +// +// LttvTracefileContext *tfc = (LttvTracefileContext *)call_data; +// +// LttvTracefileState *tfs = (LttvTracefileState *)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,NULL,NULL)) +// return FALSE; +// +// guint cpu = tfs->cpu; +// guint trace_num = ts->parent.index; +// LttvProcessState *process = ts->running_process[cpu]; +// g_assert(process != NULL); +// +// guint pid = process->pid; +// +// /* Well, the process_out existed : we must get it in the process hash +// * or add it, and draw its items. +// */ +// /* Add process to process list (if not present) */ +// guint pl_height = 0; +// HashedResourceData *hashed_process_data = NULL; +// ProcessList *process_list = control_flow_data->process_list; +// LttTime birth = process->creation_time; +// +// 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, "CPU0"); +//// hashed_process_data = processlist_get_process_data(process_list, +//// pid, +//// process->cpu, +//// &birth, +//// trace_num); +// if(unlikely(hashed_process_data == NULL)) +// { +// g_assert(pid == 0 || pid != process->ppid); +// ResourceInfo *process_info; +// /* Process not present */ +// Drawing_t *drawing = control_flow_data->drawing; +// 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); +// } +// /* Set the current process */ +// process_list->current_hash_data[trace_num][process->cpu] = +// hashed_process_data; +// } +// +// processlist_set_name(process_list, process->name, hashed_process_data); +// +// return 0; +// +//} - /* Add process to process list (if not present) */ - LttvProcessState *process_in; - LttTime birth; - guint pl_height = 0; - HashedProcessData *hashed_process_data_in = NULL; +/* Get the filename of the process to print */ +//int after_user_generic_thread_brand_hook(void *hook_data, void *call_data) +//{ +// LttvTraceHookByFacility *thf = (LttvTraceHookByFacility*)hook_data; +// EventsRequest *events_request = (EventsRequest*)thf->hook_data; +// ControlFlowData *control_flow_data = events_request->viewer_data; +// +// LttvTracefileContext *tfc = (LttvTracefileContext *)call_data; +// +// LttvTracefileState *tfs = (LttvTracefileState *)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,NULL,NULL)) +// return FALSE; +// +// guint cpu = tfs->cpu; +// guint trace_num = ts->parent.index; +// LttvProcessState *process = ts->running_process[cpu]; +// g_assert(process != NULL); +// +// guint pid = process->pid; +// +// /* Well, the process_out existed : we must get it in the process hash +// * or add it, and draw its items. +// */ +// /* Add process to process list (if not present) */ +// guint pl_height = 0; +// HashedResourceData *hashed_process_data = NULL; +// ProcessList *process_list = control_flow_data->process_list; +// LttTime birth = process->creation_time; +// +// 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, "CPU0"); +//// hashed_process_data = processlist_get_process_data(process_list, +//// pid, +//// process->cpu, +//// &birth, +//// trace_num); +// if(unlikely(hashed_process_data == NULL)) +// { +// g_assert(pid == 0 || pid != process->ppid); +// ResourceInfo *process_info; +// /* Process not present */ +// Drawing_t *drawing = control_flow_data->drawing; +// 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); +// } +// /* Set the current process */ +// process_list->current_hash_data[trace_num][process->cpu] = +// hashed_process_data; +// } +// +// processlist_set_brand(process_list, process->brand, hashed_process_data); +// +// return 0; +// +//} - ProcessList *process_list = control_flow_data->process_list; - guint trace_num = ts->parent.index; - - guint pid_in; - { - pid_in = ltt_event_get_long_unsigned(e, thf->f1); - } - - if(pid_in == 0) { - first_cpu = 0; - nb_cpus = ltt_trace_get_num_cpu(ts->parent.t); - } else { - first_cpu = ANY_CPU; - nb_cpus = ANY_CPU+1; - } - for(cpu = first_cpu; cpu < nb_cpus; cpu++) { - /* Find process pid_in in the list... */ - process_in = lttv_state_find_process(ts, 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); - #endif //EXTRA_CHECK - 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) - { - if(pid_in != 0 && pid_in == process_in->ppid) - g_critical("TEST %u , %u", pid_in, process_in->ppid); - 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); - } else { - processlist_set_name(process_list, process_in->name, - hashed_process_data_in); - processlist_set_ppid(process_list, process_in->ppid, - hashed_process_data_in); - processlist_set_tgid(process_list, process_in->tgid, - hashed_process_data_in); - } - } - return 0; -} +/* after_event_enum_process_hook + * + * Create the processlist entry for the child process. Put the last + * position in x at the current time value. + * + * @param hook_data ControlFlowData structure of the viewer. + * @param call_data Event context. + * + * This function adds items to be drawn in a queue for each process. + * + */ +//int after_event_enum_process_hook(void *hook_data, void *call_data) +//{ +// LttvTraceHookByFacility *thf = (LttvTraceHookByFacility*)hook_data; +// EventsRequest *events_request = (EventsRequest*)thf->hook_data; +// ControlFlowData *control_flow_data = events_request->viewer_data; +// +// LttvTracefileContext *tfc = (LttvTracefileContext *)call_data; +// +// LttvTracefileState *tfs = (LttvTracefileState *)call_data; +// +// LttvTraceState *ts = (LttvTraceState *)tfc->t_context; +// +// guint first_cpu, nb_cpus, cpu; +// +// 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,NULL,NULL)) +// return FALSE; +// +// LttTime evtime = ltt_event_time(e); +// +// /* Add process to process list (if not present) */ +// LttvProcessState *process_in; +// LttTime birth; +// guint pl_height = 0; +// HashedResourceData *hashed_process_data_in = NULL; +// +// ProcessList *process_list = control_flow_data->process_list; +// guint trace_num = ts->parent.index; +// +// guint pid_in; +// { +// pid_in = ltt_event_get_long_unsigned(e, thf->f1); +// } +// +// if(pid_in == 0) { +// first_cpu = 0; +// nb_cpus = ltt_trace_get_num_cpu(ts->parent.t); +// } else { +// first_cpu = ANY_CPU; +// nb_cpus = ANY_CPU+1; +// } +// +// for(cpu = first_cpu; cpu < nb_cpus; cpu++) { +// /* Find process pid_in in the list... */ +// process_in = lttv_state_find_process(ts, 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); +// #endif //EXTRA_CHECK +// birth = process_in->creation_time; +// +// hashed_process_data_in = processlist_get_process_data(process_list, "CPU0"); +//// hashed_process_data_in = processlist_get_process_data(process_list, +//// pid_in, +//// process_in->cpu, +//// &birth, +//// trace_num); +// if(hashed_process_data_in == NULL) +// { +// if(pid_in != 0 && pid_in == process_in->ppid) +// g_critical("TEST %u , %u", pid_in, process_in->ppid); +// g_assert(pid_in == 0 || pid_in != process_in->ppid); +// ResourceInfo *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); +// } else { +// processlist_set_name(process_list, process_in->name, +// hashed_process_data_in); +// processlist_set_ppid(process_list, process_in->ppid, +// hashed_process_data_in); +// processlist_set_tgid(process_list, process_in->tgid, +// hashed_process_data_in); +// } +// } +// return 0; +//} gint update_time_window_hook(void *hook_data, void *call_data) @@ -2394,167 +2414,168 @@ typedef struct _ClosureData { guint x_end; } ClosureData; +/* Draw line until end of the screen */ void draw_closure(gpointer key, gpointer value, gpointer user_data) { - ProcessInfo *process_info = (ProcessInfo*)key; - HashedProcessData *hashed_process_data = (HashedProcessData*)value; - ClosureData *closure_data = (ClosureData*)user_data; - - EventsRequest *events_request = closure_data->events_request; - ControlFlowData *control_flow_data = events_request->viewer_data; - - LttvTracesetState *tss = closure_data->tss; - LttvTracesetContext *tsc = (LttvTracesetContext*)tss; - - LttTime evtime = closure_data->end_time; - - gboolean dodraw = TRUE; - - { - /* For the process */ - /* 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 - * draw items from the beginning of the read for it. If it is not - * present, it's a new process and it was not present : it will - * be added after the state update. */ -#ifdef EXTRA_CHECK - g_assert(lttv_traceset_number(tsc->ts) > 0); -#endif //EXTRA_CHECK - LttvTraceContext *tc = tsc->traces[process_info->trace_num]; - LttvTraceState *ts = (LttvTraceState*)tc; - -#if 0 - //FIXME : optimize data structures. - LttvTracefileState *tfs; - LttvTracefileContext *tfc; - guint i; - for(i=0;itracefiles->len;i++) { - tfc = g_array_index(tc->tracefiles, LttvTracefileContext*, i); - if(ltt_tracefile_name(tfc->tf) == LTT_NAME_CPU - && tfs->cpu == process_info->cpu) - break; - - } - g_assert(itracefiles->len); - tfs = LTTV_TRACEFILE_STATE(tfc); -#endif //0 - // LttvTracefileState *tfs = - // (LttvTracefileState*)tsc->traces[process_info->trace_num]-> - // tracefiles[process_info->cpu]; - - LttvProcessState *process; - process = lttv_state_find_process(ts, process_info->cpu, - process_info->pid); - - if(unlikely(process != NULL)) { - - LttvFilter *filter = control_flow_data->filter; - if(filter != NULL && filter->head != NULL) - if(!lttv_filter_tree_parse(filter->head,NULL,NULL, - tc->t,NULL,process,tc)) - dodraw = FALSE; - - /* Only draw for processes that are currently in the trace states */ - - ProcessList *process_list = control_flow_data->process_list; -#ifdef EXTRA_CHECK - /* Should be alike when background info is ready */ - if(control_flow_data->background_info_waiting==0) - g_assert(ltt_time_compare(process->creation_time, - process_info->birth) == 0); -#endif //EXTRA_CHECK - - /* Now, the process is in the state hash and our own process hash. - * We definitely can draw the items related to the ending state. - */ - - if(unlikely(ltt_time_compare(hashed_process_data->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; -#endif //EXTRA_CHECK - Drawing_t *drawing = control_flow_data->drawing; - guint width = drawing->width; - - guint x = closure_data->x_end; - - DrawContext draw_context; - - /* Now create the drawing context that will be used to draw - * items related to the last state. */ - draw_context.drawable = hashed_process_data->pixmap; - draw_context.gc = drawing->gc; - draw_context.pango_layout = drawing->pango_layout; - draw_context.drawinfo.end.x = x; - - draw_context.drawinfo.y.over = 1; - draw_context.drawinfo.y.middle = (hashed_process_data->height/2); - draw_context.drawinfo.y.under = hashed_process_data->height; - - draw_context.drawinfo.start.offset.over = 0; - draw_context.drawinfo.start.offset.middle = 0; - draw_context.drawinfo.start.offset.under = 0; - draw_context.drawinfo.end.offset.over = 0; - draw_context.drawinfo.end.offset.middle = 0; - draw_context.drawinfo.end.offset.under = 0; -#if 0 - /* Jump over draw if we are at the same x position */ - if(x == hashed_process_data->x.over) - { - /* jump */ - } else { - draw_context.drawinfo.start.x = hashed_process_data->x.over; - /* Draw the line */ - PropertiesLine prop_line = prepare_execmode_line(process); - draw_line((void*)&prop_line, (void*)&draw_context); - - hashed_process_data->x.over = x; - } -#endif //0 - - if(unlikely(x == hashed_process_data->x.middle && - hashed_process_data->x.middle_used)) { -#if 0 /* do not mark closure : not missing information */ - if(hashed_process_data->x.middle_marked == FALSE) { - /* Draw collision indicator */ - gdk_gc_set_foreground(drawing->gc, &drawing_colors[COL_WHITE]); - gdk_draw_point(drawing->pixmap, - drawing->gc, - x, - y+(height/2)-3); - hashed_process_data->x.middle_marked = TRUE; - } -#endif //0 - /* Jump */ - } else { - draw_context.drawinfo.start.x = hashed_process_data->x.middle; - /* Draw the line */ - if(dodraw) { - PropertiesLine prop_line = prepare_s_e_line(process); - draw_line((void*)&prop_line, (void*)&draw_context); - } - - /* become the last x position */ - if(likely(x != hashed_process_data->x.middle)) { - hashed_process_data->x.middle = x; - /* but don't use the pixel */ - hashed_process_data->x.middle_used = FALSE; - - /* Calculate the next good time */ - convert_pixels_to_time(width, x+1, time_window, - &hashed_process_data->next_good_time); - } - } - } - } - } +// ResourceInfo *process_info = (ResourceInfo*)key; +// HashedResourceData *hashed_process_data = (HashedResourceData*)value; +// ClosureData *closure_data = (ClosureData*)user_data; +// +// EventsRequest *events_request = closure_data->events_request; +// ControlFlowData *control_flow_data = events_request->viewer_data; +// +// LttvTracesetState *tss = closure_data->tss; +// LttvTracesetContext *tsc = (LttvTracesetContext*)tss; +// +// LttTime evtime = closure_data->end_time; +// +// gboolean dodraw = TRUE; +// +// { +// /* For the process */ +// /* 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 +// * draw items from the beginning of the read for it. If it is not +// * present, it's a new process and it was not present : it will +// * be added after the state update. */ +//#ifdef EXTRA_CHECK +// g_assert(lttv_traceset_number(tsc->ts) > 0); +//#endif //EXTRA_CHECK +// LttvTraceContext *tc = tsc->traces[process_info->trace_num]; +// LttvTraceState *ts = (LttvTraceState*)tc; +// +//#if 0 +// //FIXME : optimize data structures. +// LttvTracefileState *tfs; +// LttvTracefileContext *tfc; +// guint i; +// for(i=0;itracefiles->len;i++) { +// tfc = g_array_index(tc->tracefiles, LttvTracefileContext*, i); +// if(ltt_tracefile_name(tfc->tf) == LTT_NAME_CPU +// && tfs->cpu == process_info->cpu) +// break; +// +// } +// g_assert(itracefiles->len); +// tfs = LTTV_TRACEFILE_STATE(tfc); +//#endif //0 +// // LttvTracefileState *tfs = +// // (LttvTracefileState*)tsc->traces[process_info->trace_num]-> +// // tracefiles[process_info->cpu]; +// +// LttvProcessState *process; +// process = lttv_state_find_process(ts, process_info->cpu, +// process_info->pid); +// +// if(unlikely(process != NULL)) { +// +// LttvFilter *filter = control_flow_data->filter; +// if(filter != NULL && filter->head != NULL) +// if(!lttv_filter_tree_parse(filter->head,NULL,NULL, +// tc->t,NULL,process,tc)) +// dodraw = FALSE; +// +// /* Only draw for processes that are currently in the trace states */ +// +// ProcessList *process_list = control_flow_data->process_list; +//#ifdef EXTRA_CHECK +// /* Should be alike when background info is ready */ +// if(control_flow_data->background_info_waiting==0) +// g_assert(ltt_time_compare(process->creation_time, +// process_info->birth) == 0); +//#endif //EXTRA_CHECK +// +// /* Now, the process is in the state hash and our own process hash. +// * We definitely can draw the items related to the ending state. +// */ +// +// if(unlikely(ltt_time_compare(hashed_process_data->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; +//#endif //EXTRA_CHECK +// Drawing_t *drawing = control_flow_data->drawing; +// guint width = drawing->width; +// +// guint x = closure_data->x_end; +// +// DrawContext draw_context; +// +// /* Now create the drawing context that will be used to draw +// * items related to the last state. */ +// draw_context.drawable = hashed_process_data->pixmap; +// draw_context.gc = drawing->gc; +// draw_context.pango_layout = drawing->pango_layout; +// draw_context.drawinfo.end.x = x; +// +// draw_context.drawinfo.y.over = 1; +// draw_context.drawinfo.y.middle = (hashed_process_data->height/2); +// draw_context.drawinfo.y.under = hashed_process_data->height; +// +// draw_context.drawinfo.start.offset.over = 0; +// draw_context.drawinfo.start.offset.middle = 0; +// draw_context.drawinfo.start.offset.under = 0; +// draw_context.drawinfo.end.offset.over = 0; +// draw_context.drawinfo.end.offset.middle = 0; +// draw_context.drawinfo.end.offset.under = 0; +//#if 0 +// /* Jump over draw if we are at the same x position */ +// if(x == hashed_process_data->x.over) +// { +// /* jump */ +// } else { +// draw_context.drawinfo.start.x = hashed_process_data->x.over; +// /* Draw the line */ +// PropertiesLine prop_line = prepare_execmode_line(process); +// draw_line((void*)&prop_line, (void*)&draw_context); +// +// hashed_process_data->x.over = x; +// } +//#endif //0 +// +// if(unlikely(x == hashed_process_data->x.middle && +// hashed_process_data->x.middle_used)) { +//#if 0 /* do not mark closure : not missing information */ +// if(hashed_process_data->x.middle_marked == FALSE) { +// /* Draw collision indicator */ +// gdk_gc_set_foreground(drawing->gc, &drawing_colors[COL_WHITE]); +// gdk_draw_point(drawing->pixmap, +// drawing->gc, +// x, +// y+(height/2)-3); +// hashed_process_data->x.middle_marked = TRUE; +// } +//#endif //0 +// /* Jump */ +// } else { +// draw_context.drawinfo.start.x = hashed_process_data->x.middle; +// /* Draw the line */ +// if(dodraw) { +// PropertiesLine prop_line = prepare_s_e_line(process); +// draw_line((void*)&prop_line, (void*)&draw_context); +// } +// +// /* become the last x position */ +// if(likely(x != hashed_process_data->x.middle)) { +// hashed_process_data->x.middle = x; +// /* but don't use the pixel */ +// hashed_process_data->x.middle_used = FALSE; +// +// /* Calculate the next good time */ +// convert_pixels_to_time(width, x+1, time_window, +// &hashed_process_data->next_good_time); +// } +// } +// } +// } +// } return; } @@ -2595,37 +2616,38 @@ int before_request(void *hook_data, void *call_data) * draw closing line * expose */ +// TODO pmf: reenable this int after_request(void *hook_data, void *call_data) { - EventsRequest *events_request = (EventsRequest*)hook_data; - ControlFlowData *control_flow_data = events_request->viewer_data; - LttvTracesetState *tss = (LttvTracesetState*)call_data; - - ProcessList *process_list = control_flow_data->process_list; - LttTime end_time = events_request->end_time; - - ClosureData closure_data; - closure_data.events_request = (EventsRequest*)hook_data; - closure_data.tss = tss; - closure_data.end_time = end_time; - - TimeWindow time_window = - lttvwindow_get_time_window(control_flow_data->tab); - guint width = control_flow_data->drawing->width; - convert_time_to_pixels( - time_window, - end_time, - width, - &closure_data.x_end); - - - /* Draw last items */ - g_hash_table_foreach(process_list->process_hash, draw_closure, - (void*)&closure_data); - - - /* Request expose */ - drawing_request_expose(events_request, tss, end_time); +// EventsRequest *events_request = (EventsRequest*)hook_data; +// ControlFlowData *control_flow_data = events_request->viewer_data; +// LttvTracesetState *tss = (LttvTracesetState*)call_data; +// +// ProcessList *process_list = control_flow_data->process_list; +// LttTime end_time = events_request->end_time; +// +// ClosureData closure_data; +// closure_data.events_request = (EventsRequest*)hook_data; +// closure_data.tss = tss; +// closure_data.end_time = end_time; +// +// TimeWindow time_window = +// lttvwindow_get_time_window(control_flow_data->tab); +// guint width = control_flow_data->drawing->width; +// convert_time_to_pixels( +// time_window, +// end_time, +// width, +// &closure_data.x_end); +// +// +// /* Draw last items */ +// g_hash_table_foreach(process_list->process_hash, draw_closure, +// (void*)&closure_data); +// +// +// /* Request expose */ +// drawing_request_expose(events_request, tss, end_time); return 0; } diff --git a/ltt/branches/poly/lttv/modules/gui/resourceview/eventhooks.h b/ltt/branches/poly/lttv/modules/gui/resourceview/eventhooks.h index 88376123..30e7d0da 100644 --- a/ltt/branches/poly/lttv/modules/gui/resourceview/eventhooks.h +++ b/ltt/branches/poly/lttv/modules/gui/resourceview/eventhooks.h @@ -57,7 +57,7 @@ void send_test_data(ProcessList *process_list, Drawing_t *drawing); -GtkWidget *h_guicontrolflow(LttvPlugin *plugin); +GtkWidget *h_resourceview(LttvPlugin *plugin); GtkWidget *h_legend(LttvPlugin *plugin); diff --git a/ltt/branches/poly/lttv/modules/gui/resourceview/module.c b/ltt/branches/poly/lttv/modules/gui/resourceview/module.c index 8165ccea..795fc6f7 100644 --- a/ltt/branches/poly/lttv/modules/gui/resourceview/module.c +++ b/ltt/branches/poly/lttv/modules/gui/resourceview/module.c @@ -59,7 +59,7 @@ static void init() { "Insert Resource Viewer", hGuiControlFlowInsert_xpm, "Insert Resource Viewer", - h_guicontrolflow); + h_resourceview); LTT_NAME_CPU = g_quark_from_string("/cpu"); @@ -86,7 +86,7 @@ static void destroy() { g_slist_free(g_control_flow_data_list); /* Unregister the toolbar insert button and menu entry */ - lttvwindow_unregister_constructor(h_guicontrolflow); + lttvwindow_unregister_constructor(h_resourceview); } diff --git a/ltt/branches/poly/lttv/modules/gui/resourceview/processlist.c b/ltt/branches/poly/lttv/modules/gui/resourceview/processlist.c index 63bf3435..ebe1fe39 100644 --- a/ltt/branches/poly/lttv/modules/gui/resourceview/processlist.c +++ b/ltt/branches/poly/lttv/modules/gui/resourceview/processlist.c @@ -26,13 +26,14 @@ #include #include #include +# #include "processlist.h" #include "drawing.h" #include "drawitem.h" #define g_info(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format) -#define g_debug(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, format) +//#define g_debug(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, format) /* Preallocated Size of the index_to_pixmap array */ #define ALLOCATE_PROCESSES 1000 @@ -42,99 +43,123 @@ *****************************************************************************/ -gint process_sort_func ( GtkTreeModel *model, - GtkTreeIter *it_a, - GtkTreeIter *it_b, - gpointer user_data) -{ - gchar *a_name; - gchar *a_brand; - guint a_pid, a_tgid, a_ppid, a_cpu; - gulong a_birth_s, a_birth_ns; - guint a_trace; - - gchar *b_name; - gchar *b_brand; - guint b_pid, b_tgid, b_ppid, b_cpu; - gulong b_birth_s, b_birth_ns; - guint b_trace; - - gtk_tree_model_get(model, - it_a, - PROCESS_COLUMN, &a_name, - BRAND_COLUMN, &a_brand, - PID_COLUMN, &a_pid, - TGID_COLUMN, &a_tgid, - PPID_COLUMN, &a_ppid, - CPU_COLUMN, &a_cpu, - BIRTH_S_COLUMN, &a_birth_s, - BIRTH_NS_COLUMN, &a_birth_ns, - TRACE_COLUMN, &a_trace, - -1); - - gtk_tree_model_get(model, - it_b, - PROCESS_COLUMN, &b_name, - BRAND_COLUMN, &b_brand, - PID_COLUMN, &b_pid, - TGID_COLUMN, &b_tgid, - PPID_COLUMN, &b_ppid, - CPU_COLUMN, &b_cpu, - BIRTH_S_COLUMN, &b_birth_s, - BIRTH_NS_COLUMN, &b_birth_ns, - TRACE_COLUMN, &b_trace, - -1); - - - /* Order by PID */ - if(a_pid == 0 && b_pid == 0) { - /* If 0, order by CPU */ - if(a_cpu > b_cpu) return 1; - if(a_cpu < b_cpu) return -1; - - } else { /* if not 0, order by pid */ - - if(a_pid > b_pid) return 1; - if(a_pid < b_pid) return -1; - } - - /* Order by birth second */ - - if(a_birth_s > b_birth_s) return 1; - if(a_birth_s < b_birth_s) return -1; - - - /* Order by birth nanosecond */ - if(a_birth_ns > b_birth_ns) return 1; - if(a_birth_ns < b_birth_ns) return -1; - - /* Order by trace_num */ - if(a_trace > b_trace) return 1; - if(a_trace < b_trace) return -1; - - return 0; +//gint process_sort_func ( GtkTreeModel *model, +// GtkTreeIter *it_a, +// GtkTreeIter *it_b, +// gpointer user_data) +//{ +// gchar *a_name; +// gchar *a_brand; +// guint a_pid, a_tgid, a_ppid, a_cpu; +// gulong a_birth_s, a_birth_ns; +// guint a_trace; +// +// gchar *b_name; +// gchar *b_brand; +// guint b_pid, b_tgid, b_ppid, b_cpu; +// gulong b_birth_s, b_birth_ns; +// guint b_trace; +// +// gtk_tree_model_get(model, +// it_a, +// PROCESS_COLUMN, &a_name, +// BRAND_COLUMN, &a_brand, +// PID_COLUMN, &a_pid, +// TGID_COLUMN, &a_tgid, +// PPID_COLUMN, &a_ppid, +// CPU_COLUMN, &a_cpu, +// BIRTH_S_COLUMN, &a_birth_s, +// BIRTH_NS_COLUMN, &a_birth_ns, +// TRACE_COLUMN, &a_trace, +// -1); +// +// gtk_tree_model_get(model, +// it_b, +// PROCESS_COLUMN, &b_name, +// BRAND_COLUMN, &b_brand, +// PID_COLUMN, &b_pid, +// TGID_COLUMN, &b_tgid, +// PPID_COLUMN, &b_ppid, +// CPU_COLUMN, &b_cpu, +// BIRTH_S_COLUMN, &b_birth_s, +// BIRTH_NS_COLUMN, &b_birth_ns, +// TRACE_COLUMN, &b_trace, +// -1); +// +// +// /* Order by PID */ +// if(a_pid == 0 && b_pid == 0) { +// /* If 0, order by CPU */ +// if(a_cpu > b_cpu) return 1; +// if(a_cpu < b_cpu) return -1; +// +// } else { /* if not 0, order by pid */ +// +// if(a_pid > b_pid) return 1; +// if(a_pid < b_pid) return -1; +// } +// +// /* Order by birth second */ +// +// if(a_birth_s > b_birth_s) return 1; +// if(a_birth_s < b_birth_s) return -1; +// +// +// /* Order by birth nanosecond */ +// if(a_birth_ns > b_birth_ns) return 1; +// if(a_birth_ns < b_birth_ns) return -1; +// +// /* Order by trace_num */ +// if(a_trace > b_trace) return 1; +// if(a_trace < b_trace) return -1; +// +// return 0; +// +//} -} +//static guint process_list_hash_fct(gconstpointer key) +//{ +// guint pid = ((const ResourceInfo*)key)->pid; +// return ((pid>>8 ^ pid>>4 ^ pid>>2 ^ pid) ^ ((const ResourceInfo*)key)->cpu); +//} +// +///* If hash is good, should be different */ +//static gboolean process_list_equ_fct(gconstpointer a, gconstpointer b) +//{ +// const ResourceInfo *pa = (const ResourceInfo*)a; +// const ResourceInfo *pb = (const ResourceInfo*)b; +// +// gboolean ret = TRUE; +// +// if(likely(pa->pid != pb->pid)) +// ret = FALSE; +// if(likely((pa->pid == 0 && (pa->cpu != pb->cpu)))) +// ret = FALSE; +// if(unlikely(ltt_time_compare(pa->birth, pb->birth) != 0)) +// ret = FALSE; +// if(unlikely(pa->trace_num != pb->trace_num)) +// ret = FALSE; +// +// return ret; +//} -static guint process_list_hash_fct(gconstpointer key) +static guint resource_list_hash_fct(gconstpointer key) { - guint pid = ((const ProcessInfo*)key)->pid; - return ((pid>>8 ^ pid>>4 ^ pid>>2 ^ pid) ^ ((const ProcessInfo*)key)->cpu); + gchar *name = g_quark_to_string(((const ResourceInfo*)key)->name); + return g_str_hash(name); } -/* If hash is good, should be different */ -static gboolean process_list_equ_fct(gconstpointer a, gconstpointer b) +static gboolean resource_list_equ_fct(gconstpointer a, gconstpointer b) { - const ProcessInfo *pa = (const ProcessInfo*)a; - const ProcessInfo *pb = (const ProcessInfo*)b; + const ResourceInfo *pa = (const ResourceInfo*)a; + const ResourceInfo *pb = (const ResourceInfo*)b; gboolean ret = TRUE; - if(likely(pa->pid != pb->pid)) - ret = FALSE; - if(likely((pa->pid == 0 && (pa->cpu != pb->cpu)))) - ret = FALSE; - if(unlikely(ltt_time_compare(pa->birth, pb->birth) != 0)) + /* TODO pmf: add some else's here to make it faster */ + /* TODO pmf: this is highly inefficient */ + + if(likely(strcmp(g_quark_to_string(pa->name), g_quark_to_string(pb->name)) != 0)) ret = FALSE; if(unlikely(pa->trace_num != pb->trace_num)) ret = FALSE; @@ -173,8 +198,8 @@ gboolean scroll_event(GtkWidget *widget, GdkEventScroll *event, gpointer data) } -static void update_index_to_pixmap_each(ProcessInfo *key, - HashedProcessData *value, +static void update_index_to_pixmap_each(ResourceInfo *key, + HashedResourceData *value, ProcessList *process_list) { guint array_index = processlist_get_index_from_data(process_list, value); @@ -198,8 +223,8 @@ void update_index_to_pixmap(ProcessList *process_list) } -static void update_pixmap_size_each(ProcessInfo *key, - HashedProcessData *value, +static void update_pixmap_size_each(ResourceInfo *key, + HashedResourceData *value, guint width) { GdkPixmap *old_pixmap = value->pixmap; @@ -229,8 +254,8 @@ typedef struct _CopyPixmap { gint xsrc, ysrc, xdest, ydest, width, height; } CopyPixmap; -static void copy_pixmap_region_each(ProcessInfo *key, - HashedProcessData *value, +static void copy_pixmap_region_each(ResourceInfo *key, + HashedResourceData *value, CopyPixmap *cp) { GdkPixmap *src = cp->src; @@ -269,8 +294,8 @@ typedef struct _RectanglePixmap { GdkGC *gc; } RectanglePixmap; -static void rectangle_pixmap_each(ProcessInfo *key, - HashedProcessData *value, +static void rectangle_pixmap_each(ResourceInfo *key, + HashedResourceData *value, RectanglePixmap *rp) { if(rp->height == -1) @@ -360,21 +385,21 @@ ProcessList *processlist_construct(void) g_object_unref (G_OBJECT (process_list->list_store)); - gtk_tree_sortable_set_default_sort_func( - GTK_TREE_SORTABLE(process_list->list_store), - process_sort_func, - NULL, - NULL); - - - gtk_tree_sortable_set_sort_column_id( - GTK_TREE_SORTABLE(process_list->list_store), - GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, - GTK_SORT_ASCENDING); +// gtk_tree_sortable_set_default_sort_func( +// GTK_TREE_SORTABLE(process_list->list_store), +// process_sort_func, +// NULL, +// NULL); +// +// +// gtk_tree_sortable_set_sort_column_id( +// GTK_TREE_SORTABLE(process_list->list_store), +// GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, +// GTK_SORT_ASCENDING); process_list->process_hash = g_hash_table_new_full( - process_list_hash_fct, process_list_equ_fct, + resource_list_hash_fct, resource_list_equ_fct, destroy_hash_key, destroy_hash_data ); @@ -412,7 +437,7 @@ ProcessList *processlist_construct(void) column = gtk_tree_view_column_new_with_attributes ( "Resource", renderer, "text", - PROCESS_COLUMN, + NAME_COLUMN, NULL); gtk_tree_view_column_set_alignment (column, 0.0); gtk_tree_view_column_set_fixed_width (column, 45); @@ -514,8 +539,8 @@ void processlist_destroy(ProcessList *process_list) g_debug("processlist_destroy end"); } -static gboolean remove_hash_item(ProcessInfo *process_info, - HashedProcessData *hashed_process_data, +static gboolean remove_hash_item(ResourceInfo *process_info, + HashedResourceData *hashed_process_data, ProcessList *process_list) { GtkTreeIter iter; @@ -525,11 +550,12 @@ static gboolean remove_hash_item(ProcessInfo *process_info, gtk_list_store_remove (process_list->list_store, &iter); gdk_pixmap_unref(hashed_process_data->pixmap); - if(likely(process_list->current_hash_data != NULL)) { - if(likely(hashed_process_data == - process_list->current_hash_data[process_info->trace_num][process_info->cpu])) - process_list->current_hash_data[process_info->trace_num][process_info->cpu] = NULL; - } +// TODO pmf: check this; might be needed +// if(likely(process_list->current_hash_data != NULL)) { +// if(likely(hashed_process_data == +// process_list->current_hash_data[process_info->trace_num][process_info->cpu])) +// process_list->current_hash_data[process_info->trace_num][process_info->cpu] = NULL; +// } return TRUE; /* remove the element from the hash table */ } @@ -562,41 +588,41 @@ void destroy_hash_data(gpointer data) } -void processlist_set_name(ProcessList *process_list, - GQuark name, - HashedProcessData *hashed_process_data) -{ - gtk_list_store_set ( process_list->list_store, &hashed_process_data->y_iter, - PROCESS_COLUMN, g_quark_to_string(name), - -1); -} - -void processlist_set_brand(ProcessList *process_list, - GQuark brand, - HashedProcessData *hashed_process_data) -{ - gtk_list_store_set ( process_list->list_store, &hashed_process_data->y_iter, - BRAND_COLUMN, g_quark_to_string(brand), - -1); -} - -void processlist_set_tgid(ProcessList *process_list, - guint tgid, - HashedProcessData *hashed_process_data) -{ - gtk_list_store_set ( process_list->list_store, &hashed_process_data->y_iter, - TGID_COLUMN, tgid, - -1); -} - -void processlist_set_ppid(ProcessList *process_list, - guint ppid, - HashedProcessData *hashed_process_data) -{ - gtk_list_store_set ( process_list->list_store, &hashed_process_data->y_iter, - PPID_COLUMN, ppid, - -1); -} +//void processlist_set_name(ProcessList *process_list, +// GQuark name, +// HashedResourceData *hashed_process_data) +//{ +// gtk_list_store_set ( process_list->list_store, &hashed_process_data->y_iter, +// PROCESS_COLUMN, g_quark_to_string(name), +// -1); +//} +// +//void processlist_set_brand(ProcessList *process_list, +// GQuark brand, +// HashedResourceData *hashed_process_data) +//{ +// gtk_list_store_set ( process_list->list_store, &hashed_process_data->y_iter, +// BRAND_COLUMN, g_quark_to_string(brand), +// -1); +//} +// +//void processlist_set_tgid(ProcessList *process_list, +// guint tgid, +// HashedResourceData *hashed_process_data) +//{ +// gtk_list_store_set ( process_list->list_store, &hashed_process_data->y_iter, +// TGID_COLUMN, tgid, +// -1); +//} +// +//void processlist_set_ppid(ProcessList *process_list, +// guint ppid, +// HashedResourceData *hashed_process_data) +//{ +// gtk_list_store_set ( process_list->list_store, &hashed_process_data->y_iter, +// PPID_COLUMN, ppid, +// -1); +//} int resourcelist_add( ProcessList *process_list, Drawing_t *drawing, @@ -605,18 +631,19 @@ int resourcelist_add( ProcessList *process_list, // guint cpu, // guint ppid, // LttTime *birth, -// guint trace_num, + guint trace_num, GQuark name, // GQuark brand, guint *height, - ResourceInfo **pm_process_info, - ProcessInfo - ResourceProcessData **pm_hashed_process_data) + ResourceInfo **pm_resource_info, + HashedResourceData **pm_hashed_resource_data) { - ResourceInfo *Process_Info = g_new(ProcessInfo, 1); - HashedResourceData *hashed_resource_data = g_new(HashedProcessData, 1); + ResourceInfo *Resource_Info = g_new(ResourceInfo, 1); + HashedResourceData *hashed_resource_data = g_new(HashedResourceData, 1); *pm_hashed_resource_data = hashed_resource_data; *pm_resource_info = Resource_Info; + + Resource_Info->name = name; // Process_Info->pid = pid; // Process_Info->tgid = tgid; @@ -626,7 +653,7 @@ int resourcelist_add( ProcessList *process_list, // Process_Info->cpu = 0; // Process_Info->ppid = ppid; // Process_Info->birth = *birth; -// Process_Info->trace_num = trace_num; + Resource_Info->trace_num = trace_num; /* When we create it from before state update, we are sure that the * last event occured before the beginning of the global area. @@ -653,37 +680,37 @@ int resourcelist_add( ProcessList *process_list, /* Add a new row to the model */ gtk_list_store_append ( process_list->list_store, - &hashed_process_data->y_iter); + &hashed_resource_data->y_iter); - gtk_list_store_set ( process_list->list_store, &hashed_process_data->y_iter, - PROCESS_COLUMN, g_quark_to_string(name), + gtk_list_store_set ( process_list->list_store, &hashed_resource_data->y_iter, + NAME_COLUMN, g_quark_to_string(name), -1); g_hash_table_insert(process_list->process_hash, - (gpointer)Process_Info, - (gpointer)hashed_process_data); + (gpointer)Resource_Info, + (gpointer)hashed_resource_data); process_list->number_of_process++; // of resources - hashed_process_data->height = process_list->cell_height; + hashed_resource_data->height = process_list->cell_height; - g_assert(hashed_process_data->height != 0); + g_assert(hashed_resource_data->height != 0); - *height = hashed_process_data->height * process_list->number_of_process; + *height = hashed_resource_data->height * process_list->number_of_process; - hashed_process_data->pixmap = + hashed_resource_data->pixmap = gdk_pixmap_new(drawing->drawing_area->window, drawing->alloc_width, - hashed_process_data->height, + hashed_resource_data->height, -1); // Clear the image with black background - gdk_draw_rectangle (hashed_process_data->pixmap, + gdk_draw_rectangle (hashed_resource_data->pixmap, drawing->drawing_area->style->black_gc, TRUE, 0, 0, drawing->alloc_width, - hashed_process_data->height); + hashed_resource_data->height); update_index_to_pixmap(process_list); @@ -700,11 +727,11 @@ int resourcelist_add( ProcessList *process_list, // GQuark name, // GQuark brand, // guint *height, -// ProcessInfo **pm_process_info, -// HashedProcessData **pm_hashed_process_data) +// ResourceInfo **pm_process_info, +// HashedResourceData **pm_hashed_process_data) //{ -// ProcessInfo *Process_Info = g_new(ProcessInfo, 1); -// HashedProcessData *hashed_process_data = g_new(HashedProcessData, 1); +// ResourceInfo *Process_Info = g_new(ResourceInfo, 1); +// HashedResourceData *hashed_process_data = g_new(HashedResourceData, 1); // *pm_hashed_process_data = hashed_process_data; // *pm_process_info = Process_Info; // @@ -786,55 +813,56 @@ int resourcelist_add( ProcessList *process_list, // return 0; //} -int processlist_remove( ProcessList *process_list, - guint pid, - guint cpu, - LttTime *birth, - guint trace_num) -{ - ProcessInfo process_info; - HashedProcessData *hashed_process_data; - GtkTreeIter iter; - - 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; - - - hashed_process_data = - (HashedProcessData*)g_hash_table_lookup( - process_list->process_hash, - &process_info); - if(likely(hashed_process_data != NULL)) - { - 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); - - if(likely(process_list->current_hash_data != NULL)) { - if(likely(hashed_process_data == process_list->current_hash_data[trace_num][cpu])) { - process_list->current_hash_data[trace_num][cpu] = NULL; - } - } - - gdk_pixmap_unref(hashed_process_data->pixmap); - - update_index_to_pixmap(process_list); - - process_list->number_of_process--; - - return 0; - } else { - return 1; - } -} +// TODO pmf: make this work once again +//int processlist_remove( ProcessList *process_list, +// guint pid, +// guint cpu, +// LttTime *birth, +// guint trace_num) +//{ +// ResourceInfo process_info; +// HashedResourceData *hashed_process_data; +// GtkTreeIter iter; +// +// 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; +// +// +// hashed_process_data = +// (HashedResourceData*)g_hash_table_lookup( +// process_list->process_hash, +// &process_info); +// if(likely(hashed_process_data != NULL)) +// { +// 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); +// +// if(likely(process_list->current_hash_data != NULL)) { +// if(likely(hashed_process_data == process_list->current_hash_data[trace_num][cpu])) { +// process_list->current_hash_data[trace_num][cpu] = NULL; +// } +// } +// +// gdk_pixmap_unref(hashed_process_data->pixmap); +// +// update_index_to_pixmap(process_list); +// +// process_list->number_of_process--; +// +// return 0; +// } else { +// return 1; +// } +//} #if 0 diff --git a/ltt/branches/poly/lttv/modules/gui/resourceview/processlist.h b/ltt/branches/poly/lttv/modules/gui/resourceview/processlist.h index 1e38afc1..cb9828f2 100644 --- a/ltt/branches/poly/lttv/modules/gui/resourceview/processlist.h +++ b/ltt/branches/poly/lttv/modules/gui/resourceview/processlist.h @@ -49,7 +49,8 @@ enum typedef struct _ResourceInfo { - guint name; + GQuark name; + guint trace_num; } ResourceInfo; typedef struct _HashedResourceData { @@ -90,7 +91,7 @@ struct _ProcessList { gint cell_height; /* Current process pointer, one per cpu, one per trace */ - HashedProcessData ***current_hash_data; + HashedResourceData ***current_hash_data; /* Array containing index -> pixmap correspondance. Must be updated * every time the process list is reordered, process added or removed */ @@ -118,8 +119,8 @@ void processlist_clear(ProcessList *process_list); int processlist_add(ProcessList *process_list, Drawing_t * drawing, guint pid, guint tgid, guint cpu, guint ppid, LttTime *birth, guint trace_num, GQuark name, GQuark brand, guint *height, - ProcessInfo **process_info, - HashedProcessData **hashed_process_data); + ResourceInfo **process_info, + HashedResourceData **hashed_process_data); // out : success (0) and height int processlist_remove(ProcessList *process_list, guint pid, guint cpu, LttTime *birth, guint trace_num); @@ -127,19 +128,19 @@ int processlist_remove(ProcessList *process_list, guint pid, guint cpu, /* Set the name of a process */ void processlist_set_name(ProcessList *process_list, GQuark name, - HashedProcessData *hashed_process_data); + HashedResourceData *hashed_process_data); void processlist_set_brand(ProcessList *process_list, GQuark brand, - HashedProcessData *hashed_process_data); + HashedResourceData *hashed_process_data); /* Set the ppid of a process */ void processlist_set_tgid(ProcessList *process_list, guint tgid, - HashedProcessData *hashed_process_data); + HashedResourceData *hashed_process_data); void processlist_set_ppid(ProcessList *process_list, guint ppid, - HashedProcessData *hashed_process_data); + HashedResourceData *hashed_process_data); /* Synchronize the list at the left and the drawing */ @@ -189,28 +190,29 @@ static inline guint processlist_get_height(ProcessList *process_list) } -static inline HashedProcessData *processlist_get_process_data( - ProcessList *process_list, - guint pid, guint cpu, LttTime *birth, guint trace_num) +static inline HashedResourceData *processlist_get_process_data( + ProcessList *process_list, GQuark resource_name, guint trace_num) { - ProcessInfo process_info; - - process_info.pid = pid; - if(pid == 0) - process_info.cpu = cpu; - else - process_info.cpu = ANY_CPU; - process_info.birth = *birth; - process_info.trace_num = trace_num; - - return (HashedProcessData*)g_hash_table_lookup( + ResourceInfo resource_info; + +// process_info.pid = pid; +// if(pid == 0) +// process_info.cpu = cpu; +// else +// process_info.cpu = ANY_CPU; +// process_info.birth = *birth; +// process_info.trace_num = trace_num; + resource_info.name = resource_name; + resource_info.trace_num = trace_num; + + return (HashedResourceData*)g_hash_table_lookup( process_list->process_hash, - &process_info); + &resource_info); } static inline gint processlist_get_pixels_from_data( ProcessList *process_list, - HashedProcessData *hashed_process_data, + HashedResourceData *hashed_process_data, guint *y, guint *height) { @@ -230,7 +232,7 @@ static inline gint processlist_get_pixels_from_data( ProcessList *process_list, } static inline guint processlist_get_index_from_data(ProcessList *process_list, - HashedProcessData *hashed_process_data) + HashedResourceData *hashed_process_data) { gint *path_indices; GtkTreePath *tree_path; -- 2.34.1