From 44ffb95f70cba788a3bfcccabd60bb0e2bad0f1b Mon Sep 17 00:00:00 2001 From: pmf Date: Tue, 31 Jul 2007 19:46:12 +0000 Subject: [PATCH] continue implementation of resourceview git-svn-id: http://ltt.polymtl.ca/svn@2558 04897980-b3bd-0310-b5e0-8ef037075253 --- ltt/branches/poly/lttv/lttv/state.c | 18 + ltt/branches/poly/lttv/lttv/state.h | 17 +- .../lttv/modules/gui/resourceview/Makefile.am | 1 + .../lttv/modules/gui/resourceview/drawing.c | 26 +- .../lttv/modules/gui/resourceview/drawing.h | 7 + .../modules/gui/resourceview/eventhooks.c | 581 +++++++++--------- .../gui/resourceview/lttv_plugin_cfv.c | 2 +- .../modules/gui/resourceview/processlist.c | 10 +- .../modules/gui/resourceview/processlist.h | 2 + 9 files changed, 358 insertions(+), 306 deletions(-) diff --git a/ltt/branches/poly/lttv/lttv/state.c b/ltt/branches/poly/lttv/lttv/state.c index 56784300..ff388014 100644 --- a/ltt/branches/poly/lttv/lttv/state.c +++ b/ltt/branches/poly/lttv/lttv/state.c @@ -127,6 +127,11 @@ LttvProcessType LTTV_STATE_USER_THREAD, LTTV_STATE_KERNEL_THREAD; +LttvCPUMode + LTTV_CPU_UNKNOWN, + LTTV_CPU_IDLE, + LTTV_CPU_BUSY; + static GQuark LTTV_STATE_TRACEFILES, LTTV_STATE_PROCESSES, @@ -410,6 +415,8 @@ init(LttvTracesetState *self, LttvTraceset *ts) tcs->usertraces = NULL; tcs->running_process = g_new(LttvProcessState*, ltt_trace_get_num_cpu(tc->t)); + tcs->cpu_states = g_new(LttvCPUState, + ltt_trace_get_num_cpu(tc->t)); restore_init_state(tcs); for(j = 0 ; j < nb_tracefile ; j++) { tfcs = @@ -417,6 +424,7 @@ init(LttvTracesetState *self, LttvTraceset *ts) LttvTracefileContext*, j)); tfcs->tracefile_name = ltt_tracefile_name(tfcs->parent.tf); tfcs->cpu = ltt_tracefile_cpu(tfcs->parent.tf); + tfcs->cpu_state = &(tcs->cpu_states[tfcs->cpu]); if(ltt_tracefile_tid(tfcs->parent.tf) != 0) { /* It's a Usertrace */ guint tid = ltt_tracefile_tid(tfcs->parent.tf); @@ -2181,6 +2189,13 @@ static gboolean schedchange(void *hook_data, void *call_data) process->usertrace->cpu = cpu; // process->last_cpu_index = ltt_tracefile_num(((LttvTracefileContext*)s)->tf); process->state->change = s->parent.timestamp; + + /* update cpu status */ + if(pid_in == 0) + s->cpu_state->present_state = LTTV_CPU_IDLE; + else + s->cpu_state->present_state = LTTV_CPU_BUSY; + return FALSE; } @@ -3513,6 +3528,9 @@ static void module_init() LTT_FIELD_THIS_FN = g_quark_from_string("this_fn"); LTT_FIELD_CALL_SITE = g_quark_from_string("call_site"); + LTTV_CPU_UNKNOWN = g_quark_from_string("unknown"); + LTTV_CPU_IDLE = g_quark_from_string("idle"); + LTTV_CPU_BUSY = g_quark_from_string("busy"); } static void module_destroy() diff --git a/ltt/branches/poly/lttv/lttv/state.h b/ltt/branches/poly/lttv/lttv/state.h index 68c6eb25..50b13332 100644 --- a/ltt/branches/poly/lttv/lttv/state.h +++ b/ltt/branches/poly/lttv/lttv/state.h @@ -198,6 +198,12 @@ extern LttvProcessType LTTV_STATE_USER_THREAD, LTTV_STATE_KERNEL_THREAD; +typedef GQuark LttvCPUMode; +extern LttvCPUMode + LTTV_CPU_UNKNOWN, + LTTV_CPU_IDLE, + LTTV_CPU_BUSY; + typedef struct _LttvExecutionState { LttvExecutionMode t; LttvExecutionSubmode n; @@ -277,6 +283,11 @@ GType lttv_traceset_state_get_type (void); #define LTTV_IS_TRACE_STATE_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), LTTV_TRACE_STATE_TYPE)) #define LTTV_TRACE_STATE_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), LTTV_TRACE_STATE_TYPE, LttvTraceStateClass)) +typedef struct _LttvCPUState { + LttvCPUMode previous_state; + LttvCPUMode present_state; +} LttvCPUState; + struct _LttvTraceState { LttvTraceContext parent; @@ -300,6 +311,7 @@ struct _LttvTraceState { /* Array of per cpu running process */ LttvProcessState **running_process; gboolean has_precomputed_states; + LttvCPUState *cpu_states; /* state of each cpu */ }; struct _LttvTraceStateClass { @@ -332,10 +344,9 @@ int lttv_state_pop_state_cleanup(LttvProcessState *process, struct _LttvTracefileState { LttvTracefileContext parent; - //LttvProcessState *process; GQuark tracefile_name; - guint cpu; /* Current cpu of the tracefile */ -// guint saved_position; + guint cpu; /* Current cpu of the tracefile */ /* perhaps merge in cpu_state */ + LttvCPUState *cpu_state; /* cpu resource state */ }; struct _LttvTracefileStateClass { diff --git a/ltt/branches/poly/lttv/modules/gui/resourceview/Makefile.am b/ltt/branches/poly/lttv/modules/gui/resourceview/Makefile.am index 09645a04..77c76954 100644 --- a/ltt/branches/poly/lttv/modules/gui/resourceview/Makefile.am +++ b/ltt/branches/poly/lttv/modules/gui/resourceview/Makefile.am @@ -24,6 +24,7 @@ AM_CFLAGS = $(GLIB_CFLAGS) AM_CFLAGS += $(GTK_CFLAGS) +AM_CFLAGS += -fvisibility=hidden LIBS += $(GLIB_LIBS) LIBS += $(GTK_LIBS) -L${top_builddir}/lttv/modules/gui/lttvwindow/lttvwindow -llttvwindow diff --git a/ltt/branches/poly/lttv/modules/gui/resourceview/drawing.c b/ltt/branches/poly/lttv/modules/gui/resourceview/drawing.c index 81edb1e3..927ef90a 100644 --- a/ltt/branches/poly/lttv/modules/gui/resourceview/drawing.c +++ b/ltt/branches/poly/lttv/modules/gui/resourceview/drawing.c @@ -84,19 +84,12 @@ GdkColor drawing_colors[NUM_COLORS] = }; -/* -RUN+USER MODE green -RUN+SYSCALL -RUN+TRAP -RUN+IRQ -WAIT+foncé -WAIT CPU + WAIT FORK vert foncé ou jaune -IRQ rouge -TRAP: orange -SYSCALL: bleu pâle - -ZOMBIE + WAIT EXIT -*/ +GdkColor drawing_colors_cpu[NUM_COLORS_CPU] = +{ /* Pixel, R, G, B */ + { 0, 0xBBBB, 0xBBBB, 0xBBBB }, /* COL_IDLE */ + { 0, 0xFFFF, 0xFFFF, 0xFFFF }, /* COL_BUSY */ + { 0, 0xFFFF, 0x0000, 0x0000 }, /* COL_UNKNOWN */ +}; /***************************************************************************** @@ -1070,7 +1063,9 @@ Drawing_t *drawing_construct(ControlFlowData *control_flow_data) /* Allocate the colors */ GdkColormap* colormap = gdk_colormap_get_system(); gboolean success[NUM_COLORS]; - gdk_colormap_alloc_colors(colormap, drawing_colors, NUM_COLORS, FALSE, + //gdk_colormap_alloc_colors(colormap, drawing_colors, NUM_COLORS, FALSE, + // TRUE, success); + gdk_colormap_alloc_colors(colormap, drawing_colors_cpu, NUM_COLORS_CPU, FALSE, TRUE, success); drawing->gc = @@ -1127,7 +1122,8 @@ void drawing_destroy(Drawing_t *drawing) /* Free the colors */ GdkColormap* colormap = gdk_colormap_get_system(); - gdk_colormap_free_colors(colormap, drawing_colors, NUM_COLORS); + //gdk_colormap_free_colors(colormap, drawing_colors, NUM_COLORS); + gdk_colormap_free_colors(colormap, drawing_colors_cpu, NUM_COLORS_CPU); diff --git a/ltt/branches/poly/lttv/modules/gui/resourceview/drawing.h b/ltt/branches/poly/lttv/modules/gui/resourceview/drawing.h index 58f562a2..98ad6445 100644 --- a/ltt/branches/poly/lttv/modules/gui/resourceview/drawing.h +++ b/ltt/branches/poly/lttv/modules/gui/resourceview/drawing.h @@ -50,7 +50,14 @@ typedef enum _draw_color { COL_UNNAMED, /* white */ NUM_COLORS } draw_color; +typedef enum _draw_color_cpu { + COL_CPU_IDLE, + COL_CPU_BUSY, + COL_CPU_UNKNOWN, + NUM_COLORS_CPU } draw_color_cpu; + extern GdkColor drawing_colors[NUM_COLORS]; +extern GdkColor drawing_colors_cpu[NUM_COLORS_CPU]; /* This part of the viewer does : * Draw horizontal lines, getting graphic context as arg. diff --git a/ltt/branches/poly/lttv/modules/gui/resourceview/eventhooks.c b/ltt/branches/poly/lttv/modules/gui/resourceview/eventhooks.c index f6048720..d8b1ea79 100644 --- a/ltt/branches/poly/lttv/modules/gui/resourceview/eventhooks.c +++ b/ltt/branches/poly/lttv/modules/gui/resourceview/eventhooks.c @@ -354,7 +354,6 @@ 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 @@ -366,13 +365,11 @@ int before_schedchange_hook(void *hook_data, void *call_data) guint pid_in; 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; - } +// 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, @@ -384,9 +381,12 @@ 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); + { + gchar *cpustr; + 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]; @@ -419,14 +419,10 @@ int before_schedchange_hook(void *hook_data, void *call_data) Drawing_t *drawing = control_flow_data->drawing; resourcelist_add(process_list, drawing, -// pid_out, -// process->tgid, -// process->cpu, -// process->ppid, -// &birth, trace_num, cpuq, //process->name, -// process->brand, + 0, //cpu + cpu, &pl_height, &process_info, &hashed_process_data); @@ -531,12 +527,13 @@ int before_schedchange_hook(void *hook_data, void *call_data) 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]; + //if(pid_out == 0) { + if(tfs->cpu_state->present_state == LTTV_CPU_IDLE) { + prop_line.color = drawing_colors_cpu[COL_CPU_IDLE]; + } + else { + prop_line.color = drawing_colors_cpu[COL_CPU_BUSY]; + } draw_line((void*)&prop_line, (void*)&draw_context); @@ -761,117 +758,120 @@ int before_schedchange_hook(void *hook_data, void *call_data) */ 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; -// } -// } + 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); + + GQuark cpuq; + + /* 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; + { + gchar *cpustr; + cpustr = g_strdup_printf("CPU%u", cpu); + cpuq = g_quark_from_string(cpustr); + g_free(cpustr); + } + 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, + trace_num, + cpuq, + 0, + cpu, + &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; } @@ -2418,164 +2418,183 @@ typedef struct _ClosureData { void draw_closure(gpointer key, gpointer value, gpointer user_data) { -// 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]; -// + 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); -// } -// } -// } + + /* 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); + 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 = drawing_colors_cpu[COL_IDLE]; + } + else { + prop_line.color = drawing_colors_cpu[COL_BUSY]; + } +*/ + //prop_line.color = drawing_colors_cpu[COL_CPU_UNKNOWN]; + if(ts->cpu_states[process_info->id].present_state == LTTV_CPU_IDLE) { + prop_line.color = drawing_colors_cpu[COL_CPU_IDLE]; + } + else { + prop_line.color = drawing_colors_cpu[COL_CPU_BUSY]; + } + + 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; } diff --git a/ltt/branches/poly/lttv/modules/gui/resourceview/lttv_plugin_cfv.c b/ltt/branches/poly/lttv/modules/gui/resourceview/lttv_plugin_cfv.c index d8b005ab..ca96455a 100644 --- a/ltt/branches/poly/lttv/modules/gui/resourceview/lttv_plugin_cfv.c +++ b/ltt/branches/poly/lttv/modules/gui/resourceview/lttv_plugin_cfv.c @@ -75,7 +75,7 @@ lttv_plugin_cfv_get_type (void) lttv_plugin_cfv_init /* instance_init */ }; type = g_type_register_static (G_TYPE_OBJECT, - "LttvPluginCFVType", + "LttvPluginRVType", &info, 0); } return type; diff --git a/ltt/branches/poly/lttv/modules/gui/resourceview/processlist.c b/ltt/branches/poly/lttv/modules/gui/resourceview/processlist.c index ebe1fe39..21f2370f 100644 --- a/ltt/branches/poly/lttv/modules/gui/resourceview/processlist.c +++ b/ltt/branches/poly/lttv/modules/gui/resourceview/processlist.c @@ -626,14 +626,10 @@ void destroy_hash_data(gpointer data) int resourcelist_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 type, + guint id, guint *height, ResourceInfo **pm_resource_info, HashedResourceData **pm_hashed_resource_data) @@ -654,6 +650,8 @@ int resourcelist_add( ProcessList *process_list, // Process_Info->ppid = ppid; // Process_Info->birth = *birth; Resource_Info->trace_num = trace_num; + Resource_Info->type = type; + Resource_Info->id = id; /* When we create it from before state update, we are sure that the * last event occured before the beginning of the global area. diff --git a/ltt/branches/poly/lttv/modules/gui/resourceview/processlist.h b/ltt/branches/poly/lttv/modules/gui/resourceview/processlist.h index cb9828f2..6c2704d8 100644 --- a/ltt/branches/poly/lttv/modules/gui/resourceview/processlist.h +++ b/ltt/branches/poly/lttv/modules/gui/resourceview/processlist.h @@ -51,6 +51,8 @@ enum typedef struct _ResourceInfo { GQuark name; guint trace_num; + guint type; + guint id; } ResourceInfo; typedef struct _HashedResourceData { -- 2.34.1