From: Francis Deslauriers Date: Wed, 18 Jul 2012 18:23:22 +0000 (-0400) Subject: Initial commit for control flow view X-Git-Tag: v1.5-beta1~51 X-Git-Url: http://git.liburcu.org/?p=lttv.git;a=commitdiff_plain;h=88bf15f0f2a239186b5cf6fcf8711786907ca483 Initial commit for control flow view Signed-off-by: Francis Deslauriers Signed-off-by: Yannick Brosseau --- diff --git a/lttv/lttv/print.c b/lttv/lttv/print.c index 85ede036..6ad93419 100644 --- a/lttv/lttv/print.c +++ b/lttv/lttv/print.c @@ -323,7 +323,7 @@ int getProcessInfosFromEvent(LttvEvent *event, GString* processInfos) } #endif if (noError||1) { - g_string_append_printf(processInfos, "%u, %u, %s, %u", pid, tid, procname, ppid); + g_string_append_printf(processInfos, "%u, %u, %s, %u. %s, %s", pid, tid, procname, ppid, g_quark_to_string(process->state->t), g_quark_to_string(process->state->s)); } else { ret = -1; diff --git a/lttv/lttv/state.c b/lttv/lttv/state.c index be185374..a2f609f5 100644 --- a/lttv/lttv/state.c +++ b/lttv/lttv/state.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -3317,7 +3318,6 @@ static gboolean enum_process_state(void *hook_data, void *call_data) /* Skip submode 5th param */ /* Skip status 6th param */ - /* TGID */ tgid = lttv_event_get_long(event, "pid"); diff --git a/lttv/lttv/traceset-process.c b/lttv/lttv/traceset-process.c index 54a68c07..b49542f9 100644 --- a/lttv/lttv/traceset-process.c +++ b/lttv/lttv/traceset-process.c @@ -238,8 +238,11 @@ guint lttv_process_traceset_seek_n_backward(LttvTraceset *ts, guint i, count, ret; gint extraEvent = 0; guint64 initialTimeStamp, previousTimeStamp; - LttvTracesetPosition *initialPos, *previousPos, *currentPos; - + LttvTracesetPosition *initialPos, *previousPos, *currentPos, beginPos; + struct bt_iter_pos pos; + beginPos.bt_pos = &pos; + beginPos.iter = ts->iter; + beginPos.bt_pos->type = BT_SEEK_BEGIN; /*Save initial position of the traceset*/ initialPos = lttv_traceset_create_current_position (ts); @@ -258,6 +261,13 @@ guint lttv_process_traceset_seek_n_backward(LttvTraceset *ts, break; currentPos = lttv_traceset_create_time_position(ts,ltt_time_from_uint64(previousTimeStamp)); + /*Corner case: When we are near the beginning of the trace and the previousTimeStamp is before + * the beginning of the trace. We have to seek to the first event. + */ + if((lttv_traceset_position_compare(currentPos,&beginPos ) == 0)){ + lttv_traceset_seek_to_position(&beginPos); + break; + } /*move traceset position */ lttv_state_traceset_seek_position(ts, previousPos); /* iterate to the initial position counting the number of event*/ @@ -270,10 +280,10 @@ guint lttv_process_traceset_seek_n_backward(LttvTraceset *ts, count++; } }while(ret != 0); - lttv_traceset_destroy_position(currentPos); + /*substract the desired number of event to the count*/ extraEvent = count - n; - if(extraEvent >= 0){ + if (extraEvent >= 0) { //if the extraEvent is over 0 go back to previousPos and //move forward the value of extraEvent times lttv_state_traceset_seek_position(ts, previousPos); @@ -287,9 +297,11 @@ guint lttv_process_traceset_seek_n_backward(LttvTraceset *ts, } break; /* we successfully seeked backward */ } - else{ /* if the extraEvent is below 0 create a position before and start over*/ - ratio = ratio * 16; + else{ + /* if the extraEvent is below 0 create a position before and start over*/ + ratio = ratio * 16; } + lttv_traceset_destroy_position(currentPos); } return 0; } diff --git a/lttv/lttv/traceset.c b/lttv/lttv/traceset.c index 934d65f3..54210160 100644 --- a/lttv/lttv/traceset.c +++ b/lttv/lttv/traceset.c @@ -615,6 +615,8 @@ guint64 lttv_traceset_position_get_timestamp(const LttvTracesetPosition *pos) } /* Reassign the previously saved position */ lttv_traceset_seek_to_position(&previous_pos); + /*We must desallocate because the function bt_iter_get_pos() does a g_new */ + bt_iter_free_pos(previous_pos.bt_pos); return timestamp; } diff --git a/lttv/lttv/traceset.h b/lttv/lttv/traceset.h index a5923c5d..4b998ad2 100644 --- a/lttv/lttv/traceset.h +++ b/lttv/lttv/traceset.h @@ -59,6 +59,8 @@ struct _LttvTrace { struct _LttvTracesetPosition { struct bt_ctf_iter *iter; struct bt_iter_pos *bt_pos; + guint64 timestamp; + int cpu_id; }; /* Tracesets may be added to, removed from and their content listed. */ @@ -85,6 +87,7 @@ gint lttv_traceset_save(LttvTraceset *s); void lttv_traceset_destroy(LttvTraceset *s); +LttvHooks *lttv_traceset_get_hooks(LttvTraceset *s); void lttv_traceset_add(LttvTraceset *s, LttvTrace *t); diff --git a/lttv/modules/gui/Makefile.am b/lttv/modules/gui/Makefile.am index 94f7887b..a4eeac28 100644 --- a/lttv/modules/gui/Makefile.am +++ b/lttv/modules/gui/Makefile.am @@ -6,8 +6,8 @@ # WARNING : subdirs order is important : mainWin depends on API -SUBDIRS = lttvwindow detailedevents histogram -# controlflow statistics filter tracecontrol interrupts resourceview +SUBDIRS = lttvwindow detailedevents histogram controlflow +# statistics filter tracecontrol interrupts resourceview # TODO: PORT for 0.10 #diskperformance tutorial diff --git a/lttv/modules/gui/controlflow/cfv.c b/lttv/modules/gui/controlflow/cfv.c index d807b7c9..06db4d2d 100644 --- a/lttv/modules/gui/controlflow/cfv.c +++ b/lttv/modules/gui/controlflow/cfv.c @@ -348,8 +348,9 @@ guicontrolflow_destructor(gpointer data) g_info("%p, %p, %p", update_time_window_hook, plugin_cfv, tab); if(GTK_IS_WIDGET(guicontrolflow_get_widget(plugin_cfv->cfd))) g_info("widget still exists"); - +#ifdef BABEL_CLEANUP lttv_filter_destroy(plugin_cfv->cfd->filter); +#endif //babel_cleanup /* Process List is removed with it's widget */ //ProcessList_destroy(control_flow_data->process_list); if(tab != NULL) @@ -374,7 +375,9 @@ guicontrolflow_destructor(gpointer data) lttvwindow_events_request_remove_all(control_flow_data->tab, control_flow_data); - + LttvTraceset *traceset = lttvwindow_get_traceset(tab); + LttvHooks *event_hook = lttv_traceset_get_hooks(traceset); + lttv_hooks_remove(event_hook, before_schedchange_hook); } lttvwindowtraces_background_notify_remove(control_flow_data); g_control_flow_data_list = diff --git a/lttv/modules/gui/controlflow/drawing.c b/lttv/modules/gui/controlflow/drawing.c index 751389bc..e810c6c3 100644 --- a/lttv/modules/gui/controlflow/drawing.c +++ b/lttv/modules/gui/controlflow/drawing.c @@ -27,7 +27,9 @@ #include #include +#ifdef BABEL_CLEANUP #include +#endif //babel_cleanup #include #include #include @@ -125,8 +127,11 @@ void drawing_data_request(Drawing_t *drawing, Tab *tab = drawing->control_flow_data->tab; - TimeWindow time_window = - lttvwindow_get_time_window(tab); + TimeWindow time_window = lttvwindow_get_time_window(tab); + LttvTraceset *traceset = lttvwindow_get_traceset(tab); + if(lttv_traceset_number(traceset) <= 0){ + return; + } ControlFlowData *control_flow_data = drawing->control_flow_data; // (ControlFlowData*)g_object_get_data( @@ -160,13 +165,35 @@ void drawing_data_request(Drawing_t *drawing, control_flow_data); { - /* find the tracehooks */ - LttvTracesetContext *tsc = lttvwindow_get_traceset_context(tab); - LttvTraceset *traceset = tsc->ts; + LttvHooks *event_hook; +//TODO "fdeslauriers : Is it the right way to get the hooks - july 11 2012" + event_hook = lttv_traceset_get_hooks(traceset); + g_assert(event_hook); + + lttv_hooks_add(event_hook,before_execmode_hook , control_flow_data, LTTV_PRIO_STATE); + #ifdef BABEL_CLEANUP + lttv_hooks_add(event_hook,syscall_exit , control_flow_data, LTTV_PRIO_STATE); + lttv_hooks_add(event_hook,irq_entry , control_flow_data, LTTV_PRIO_STATE); + lttv_hooks_add(event_hook,irq_exit , control_flow_data, LTTV_PRIO_STATE); + lttv_hooks_add(event_hook,soft_irq_raise , control_flow_data, LTTV_PRIO_STATE); + lttv_hooks_add(event_hook,soft_irq_entry , control_flow_data, LTTV_PRIO_STATE); + lttv_hooks_add(event_hook,soft_irq_exit , control_flow_data, LTTV_PRIO_STATE); +#endif //babel_cleanup + lttv_hooks_add(event_hook,before_schedchange_hook , control_flow_data, LTTV_PRIO_STATE); +#ifdef BABEL_CLEANUP + lttv_hooks_add(event_hook,sched_try_wakeup , control_flow_data, LTTV_PRIO_STATE); + lttv_hooks_add(event_hook,process_exit , control_flow_data, LTTV_PRIO_STATE); + lttv_hooks_add(event_hook,process_free , control_flow_data, LTTV_PRIO_STATE); + lttv_hooks_add(event_hook,process_exec , control_flow_data, LTTV_PRIO_STATE); + lttv_hooks_add(event_hook,enum_process_state , control_flow_data, LTTV_PRIO_STATE); + lttv_hooks_add(event_hook,statedump_end , control_flow_data, LTTV_PRIO_STATE); + lttv_hooks_add(event_hook,enum_interrupt , control_flow_data, LTTV_PRIO_STATE); +#endif //babel_cleanup + + guint i, k, nb_trace; LttvTraceState *ts; GArray *hooks; - LttvTraceHook *th; gint first_after; nb_trace = lttv_traceset_number(traceset); @@ -175,8 +202,7 @@ void drawing_data_request(Drawing_t *drawing, EventsRequest *events_request = g_new(EventsRequest, 1); // Create the hooks //LttvHooks *event = lttv_hooks_new(); - LttvHooksByIdChannelArray *event_by_id_channel = - lttv_hooks_by_id_channel_new(); + LttvHooks *before_chunk_traceset = lttv_hooks_new(); LttvHooks *after_chunk_traceset = lttv_hooks_new(); LttvHooks *before_request_hook = lttv_hooks_new(); @@ -202,7 +228,7 @@ void drawing_data_request(Drawing_t *drawing, events_request, LTTV_PRIO_DEFAULT); - +#ifdef BABEL_CLEANUP ts = (LttvTraceState *)tsc->traces[i]; /* Find the eventtype id for the following events and register the @@ -423,7 +449,7 @@ void drawing_data_request(Drawing_t *drawing, } events_request->hooks = hooks; - +#endif //babel_cleanup // Fill the events request events_request->owner = control_flow_data; events_request->viewer_data = control_flow_data; @@ -438,8 +464,7 @@ void drawing_data_request(Drawing_t *drawing, events_request->before_chunk_traceset = before_chunk_traceset; events_request->before_chunk_trace = NULL; events_request->before_chunk_tracefile = NULL; - events_request->event = NULL; - events_request->event_by_id_channel = event_by_id_channel; + events_request->event = event_hook; events_request->after_chunk_tracefile = NULL; events_request->after_chunk_trace = NULL; events_request->after_chunk_traceset = after_chunk_traceset; @@ -454,7 +479,9 @@ void drawing_data_request(Drawing_t *drawing, lttvwindow_events_request(tab, events_request); } - } + + +} } @@ -476,8 +503,7 @@ static void set_last_start(gpointer key, gpointer value, gpointer user_data) return; } - -void drawing_data_request_begin(EventsRequest *events_request, LttvTracesetState *tss) +void drawing_data_request_begin(EventsRequest *events_request) { g_debug("Begin of data request"); ControlFlowData *cfd = events_request->viewer_data; @@ -499,21 +525,18 @@ void drawing_data_request_begin(EventsRequest *events_request, LttvTracesetState GUINT_TO_POINTER(x)); } - -void drawing_chunk_begin(EventsRequest *events_request, LttvTracesetState *tss) +void drawing_chunk_begin(EventsRequest *events_request, LttvTraceset *ts) { g_debug("Begin of chunk"); ControlFlowData *cfd = events_request->viewer_data; - LttvTracesetContext *tsc = &tss->parent; //LttTime current_time = lttv_traceset_context_get_current_tfc(tsc)->timestamp; guint i; - LttvTraceset *traceset = tsc->ts; - guint nb_trace = lttv_traceset_number(traceset); + guint nb_trace = lttv_traceset_number(ts); if(!cfd->process_list->current_hash_data) { cfd->process_list->current_hash_data = g_new(HashedProcessData**,nb_trace); for(i = 0 ; i < nb_trace ; i++) { - guint num_cpu = ltt_trace_get_num_cpu(tss->parent.traces[i]->t); + guint num_cpu = lttv_trace_get_num_cpu( lttv_traceset_get(ts, i)); cfd->process_list->current_hash_data[i] = g_new(HashedProcessData*,num_cpu); memset(cfd->process_list->current_hash_data[i], 0, sizeof(HashedProcessData*)*num_cpu); @@ -525,7 +548,6 @@ void drawing_chunk_begin(EventsRequest *events_request, LttvTracesetState *tss) void drawing_request_expose(EventsRequest *events_request, - LttvTracesetState *tss, LttTime end_time) { gint x, width; @@ -534,8 +556,7 @@ void drawing_request_expose(EventsRequest *events_request, ControlFlowData *cfd = events_request->viewer_data; Drawing_t *drawing = cfd->drawing; - TimeWindow time_window = - lttvwindow_get_time_window(cfd->tab); + TimeWindow time_window = lttvwindow_get_time_window(cfd->tab); g_debug("request expose"); @@ -560,7 +581,6 @@ void drawing_request_expose(EventsRequest *events_request, TRUE); } - /* Callbacks */ @@ -613,7 +633,7 @@ configure_event( GtkWidget *widget, GdkEventConfigure *event, drawing->alloc_width); update_index_to_pixmap(drawing->control_flow_data->process_list); } - //drawing->height = widget->allocation.height; + drawing->height = widget->allocation.height; //ProcessList_get_height // (GuiControlFlow_get_process_list(drawing->control_flow_data)), diff --git a/lttv/modules/gui/controlflow/drawing.h b/lttv/modules/gui/controlflow/drawing.h index 3e4b3dc8..e154f16c 100644 --- a/lttv/modules/gui/controlflow/drawing.h +++ b/lttv/modules/gui/controlflow/drawing.h @@ -24,7 +24,9 @@ #include #include #include +#ifdef BABEL_CLEANUP #include +#endif //babel_cleanup #include #include #include "cfv.h" @@ -155,7 +157,7 @@ void drawing_remove_square(Drawing_t *drawing, guint height); void drawing_update_ruler(Drawing_t *drawing, TimeWindow *time_window); - +#ifdef BABEL_CLEANUP void drawing_request_expose(EventsRequest *events_request, LttvTracesetState *tss, LttTime end_time); @@ -163,7 +165,7 @@ void drawing_request_expose(EventsRequest *events_request, void drawing_data_request_begin(EventsRequest *events_request, LttvTracesetState *tss); void drawing_chunk_begin(EventsRequest *events_request, LttvTracesetState *tss); - +#endif //babel_cleanup void diff --git a/lttv/modules/gui/controlflow/drawitem.c b/lttv/modules/gui/controlflow/drawitem.c index cdeedda0..d4e2c90a 100644 --- a/lttv/modules/gui/controlflow/drawitem.c +++ b/lttv/modules/gui/controlflow/drawitem.c @@ -105,8 +105,9 @@ #include #include #include - +#ifdef BABEL_CLEANUP #include +#endif //babel_cleanup #include #include diff --git a/lttv/modules/gui/controlflow/drawitem.h b/lttv/modules/gui/controlflow/drawitem.h index 28fdc183..1e28f005 100644 --- a/lttv/modules/gui/controlflow/drawitem.h +++ b/lttv/modules/gui/controlflow/drawitem.h @@ -21,6 +21,7 @@ #define _DRAW_ITEM_H #include +#include typedef struct _DrawContext DrawContext; typedef struct _DrawInfo DrawInfo; diff --git a/lttv/modules/gui/controlflow/eventhooks.c b/lttv/modules/gui/controlflow/eventhooks.c index eb86a20f..aae0f79c 100644 --- a/lttv/modules/gui/controlflow/eventhooks.c +++ b/lttv/modules/gui/controlflow/eventhooks.c @@ -113,27 +113,27 @@ static gint background_ready(void *hook_data, void *call_data) /* Request background computation. Verify if it is in progress or ready first. * Only for each trace in the tab's traceset. */ + static void request_background_data(ControlFlowData *control_flow_data) { - LttvTracesetContext * tsc = - lttvwindow_get_traceset_context(control_flow_data->tab); - gint num_traces = lttv_traceset_number(tsc->ts); + + LttvTraceset *ts = lttvwindow_get_traceset(control_flow_data->tab); + gint num_traces = lttv_traceset_number(ts); gint i; LttvTrace *trace; LttvTraceState *tstate; - LttvHooks *background_ready_hook = - lttv_hooks_new(); + LttvHooks *background_ready_hook = lttv_hooks_new(); lttv_hooks_add(background_ready_hook, background_ready, control_flow_data, LTTV_PRIO_DEFAULT); control_flow_data->background_info_waiting = 0; for(i=0;its, i); - tstate = LTTV_TRACE_STATE(tsc->traces[i]); + trace = lttv_traceset_get(ts, i); + tstate = trace->state; if(lttvwindowtraces_get_ready(g_quark_from_string("state"),trace)==FALSE - && !tstate->has_precomputed_states) { + && !ts->has_precomputed_states) { if(lttvwindowtraces_get_in_progress(g_quark_from_string("state"), trace) == FALSE) { @@ -287,8 +287,10 @@ static inline PropertiesLine prepare_s_e_line(LttvProcessState *process) int before_trywakeup_hook(void *hook_data, void *call_data) { +#ifdef BABEL_CLEANUP LttvTraceHook *th = (LttvTraceHook*)hook_data; EventsRequest *events_request = (EventsRequest*)th->hook_data; + ControlFlowData *control_flow_data = events_request->viewer_data; LttvTracefileContext *tfc = (LttvTracefileContext *)call_data; @@ -470,6 +472,7 @@ int before_trywakeup_hook(void *hook_data, void *call_data) tfc->target_pid = target_pid_saved; return 0; +#endif //babel_cleanup } @@ -493,52 +496,44 @@ int before_trywakeup_hook(void *hook_data, void *call_data) int before_schedchange_hook(void *hook_data, void *call_data) { - LttvTraceHook *th = (LttvTraceHook*)hook_data; - EventsRequest *events_request = (EventsRequest*)th->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); - gint target_pid_saved = tfc->target_pid; + LttvEvent *event; + guint cpu; + LttvTraceState *ts; + LttvProcessState *process; + + //LttvProcessState *old_process = ts->running_process[cpu]; + + guint pid_in, pid_out; + gint64 state_out; + LttTime timestamp; + event = (LttvEvent *) call_data; + if (strcmp(lttv_traceset_get_name_from_event(event), + "sched_switch") != 0) + return FALSE; + ControlFlowData *control_flow_data = (ControlFlowData*)hook_data; - LttTime evtime = ltt_event_time(e); - LttvFilter *filter = control_flow_data->filter; /* we are in a schedchange, before the state update. We must draw the * items corresponding to the state before it changes : now is the right * time to do it. */ - - guint pid_out; - guint pid_in; - { - pid_out = ltt_event_get_long_unsigned(e, lttv_trace_get_hook_field(th, 0)); - pid_in = ltt_event_get_long_unsigned(e, lttv_trace_get_hook_field(th, 1)); - } - - 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)) { + cpu = lttv_traceset_get_cpuid_from_event(event); + ts = event->state; + process = ts->running_process[cpu]; + pid_out = lttv_event_get_long(event, "prev_tid"); + pid_in = lttv_event_get_long(event, "next_tid"); + state_out = lttv_event_get_long(event, "prev_state"); + + timestamp = lttv_event_get_timestamp(event); /* 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 * 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. */ - guint cpu = tfs->cpu; - guint trace_num = ts->parent.index; - LttvProcessState *process = ts->running_process[cpu]; - /* unknown state, bad current pid */ - if(process->pid != pid_out) - process = lttv_state_find_process(ts, - tfs->cpu, pid_out); + /* unknown state, bad current pid */ + if(process != NULL) { /* Well, the process_out existed : we must get it in the process hash * or add it, and draw its items. @@ -553,7 +548,7 @@ int before_schedchange_hook(void *hook_data, void *call_data) pid_out, process->cpu, &birth, - trace_num); + 18);//TODO "use the right value or delete" if(hashed_process_data == NULL) { g_assert(pid_out == 0 || pid_out != process->ppid); @@ -567,7 +562,7 @@ int before_schedchange_hook(void *hook_data, void *call_data) process->cpu, process->ppid, &birth, - trace_num, + 18,//TODO "use the right value or delete" process->name, process->brand, &pl_height, @@ -579,13 +574,12 @@ int before_schedchange_hook(void *hook_data, void *call_data) 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(ltt_time_compare(hashed_process_data->next_good_time, - evtime) > 0) + timestamp) > 0) { if(hashed_process_data->x.middle_marked == FALSE) { @@ -601,7 +595,7 @@ int before_schedchange_hook(void *hook_data, void *call_data) guint x; convert_time_to_pixels( time_window, - evtime, + timestamp, width, &x); @@ -626,7 +620,7 @@ int before_schedchange_hook(void *hook_data, void *call_data) guint x; convert_time_to_pixels( time_window, - evtime, + timestamp, width, &x); @@ -684,22 +678,14 @@ int before_schedchange_hook(void *hook_data, void *call_data) } } } - } - tfc->target_pid = pid_in; - if(!filter || !filter->head || - lttv_filter_tree_parse(filter->head,e,tfc->tf, - tfc->t_context->t,tfc,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; + process = ts->running_process[cpu]; if(process != NULL) { /* Well, the process existed : we must get it in the process hash @@ -713,9 +699,9 @@ int before_schedchange_hook(void *hook_data, void *call_data) hashed_process_data = processlist_get_process_data(process_list, pid_in, - tfs->cpu, + cpu, &birth, - trace_num); + 18);//TODO "use the right value or delete" if(hashed_process_data == NULL) { g_assert(pid_in == 0 || pid_in != process->ppid); @@ -726,10 +712,10 @@ int before_schedchange_hook(void *hook_data, void *call_data) drawing, pid_in, process->tgid, - tfs->cpu, + cpu, process->ppid, &birth, - trace_num, + 18, process->name, process->brand, &pl_height, @@ -749,7 +735,7 @@ int before_schedchange_hook(void *hook_data, void *call_data) */ if(ltt_time_compare(hashed_process_data->next_good_time, - evtime) > 0) + timestamp) > 0) { if(hashed_process_data->x.middle_marked == FALSE) { @@ -765,7 +751,7 @@ int before_schedchange_hook(void *hook_data, void *call_data) guint x; convert_time_to_pixels( time_window, - evtime, + timestamp, width, &x); @@ -791,7 +777,7 @@ int before_schedchange_hook(void *hook_data, void *call_data) convert_time_to_pixels( time_window, - evtime, + timestamp, width, &x); @@ -851,8 +837,9 @@ int before_schedchange_hook(void *hook_data, void *call_data) } } else g_warning("Cannot find pin_in in schedchange %u", pid_in); - } +#ifdef BABEL_CLEANUP tfc->target_pid = target_pid_saved; +#endif //babel_cleanup return 0; @@ -892,6 +879,7 @@ int before_schedchange_hook(void *hook_data, void *call_data) */ int after_schedchange_hook(void *hook_data, void *call_data) { +#ifdef BABEL_CLEANUP LttvTraceHook *th = (LttvTraceHook*)hook_data; EventsRequest *events_request = (EventsRequest*)th->hook_data; ControlFlowData *control_flow_data = events_request->viewer_data; @@ -1000,6 +988,7 @@ int after_schedchange_hook(void *hook_data, void *call_data) } return 0; +#endif //babel_cleanup } @@ -1025,36 +1014,30 @@ int after_schedchange_hook(void *hook_data, void *call_data) int before_execmode_hook(void *hook_data, void *call_data) { - LttvTraceHook *th = (LttvTraceHook*)hook_data; - EventsRequest *events_request = (EventsRequest*)th->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); - + LttvEvent *event; + guint cpu; + LttvTraceState *ts; + LttvProcessState *process; + /* 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. */ + + event = (LttvEvent *) call_data; + if (strcmp(lttv_traceset_get_name_from_event(event), + "irq_handler_entry") != 0) + return FALSE; + LttTime evtime = lttv_event_get_timestamp(event); + ControlFlowData *control_flow_data = (ControlFlowData*)hook_data; /* For the pid */ - //LttvProcessState *process = tfs->process; - guint cpu = tfs->cpu; - guint trace_num = ts->parent.index; - LttvProcessState *process = ts->running_process[cpu]; + LttvTraceset *traceSet = lttvwindow_get_traceset(control_flow_data->tab); + + cpu = lttv_traceset_get_cpuid_from_event(event); + ts = event->state; + + guint trace_number = 0;//TODO fdeslauriers 2012-07-17: // Use trace handle to know trace number + process = ts->running_process[cpu]; g_assert(process != NULL); guint pid = process->pid; @@ -1066,16 +1049,20 @@ int before_execmode_hook(void *hook_data, void *call_data) guint pl_height = 0; HashedProcessData *hashed_process_data = NULL; ProcessList *process_list = control_flow_data->process_list; + if(process_list->current_hash_data == NULL){//TODO fdeslauriers 2012-07-17 : should not be necessary + return 0; + } + 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]; + if(likely(process_list->current_hash_data[trace_number][cpu] != NULL)) { + hashed_process_data = process_list->current_hash_data[trace_number][cpu]; } else { hashed_process_data = processlist_get_process_data(process_list, pid, process->cpu, &birth, - trace_num); + trace_number); if(unlikely(hashed_process_data == NULL)) { g_assert(pid == 0 || pid != process->ppid); @@ -1089,7 +1076,7 @@ int before_execmode_hook(void *hook_data, void *call_data) process->cpu, process->ppid, &birth, - trace_num, + trace_number, process->name, process->brand, &pl_height, @@ -1101,7 +1088,7 @@ int before_execmode_hook(void *hook_data, void *call_data) gtk_widget_queue_draw(drawing->drawing_area); } /* Set the current process */ - process_list->current_hash_data[trace_num][process->cpu] = + process_list->current_hash_data[trace_number][process->cpu] = hashed_process_data; } @@ -1228,6 +1215,7 @@ int before_execmode_hook(void *hook_data, void *call_data) int before_process_exit_hook(void *hook_data, void *call_data) { +#ifdef BABEL_CLEANUP LttvTraceHook *th = (LttvTraceHook*)hook_data; EventsRequest *events_request = (EventsRequest*)th->hook_data; @@ -1407,6 +1395,7 @@ int before_process_exit_hook(void *hook_data, void *call_data) } return 0; +#endif //babel_cleanup } @@ -1426,6 +1415,7 @@ int before_process_exit_hook(void *hook_data, void *call_data) int before_process_release_hook(void *hook_data, void *call_data) { +#ifdef BABEL_CLEANUP LttvTraceHook *th = (LttvTraceHook*)hook_data; EventsRequest *events_request = (EventsRequest*)th->hook_data; @@ -1589,6 +1579,7 @@ int before_process_release_hook(void *hook_data, void *call_data) } return 0; +#endif //babel_cleanup } @@ -1608,6 +1599,7 @@ int before_process_release_hook(void *hook_data, void *call_data) */ int after_process_fork_hook(void *hook_data, void *call_data) { +#ifdef BABEL_CLEANUP LttvTraceHook *th = (LttvTraceHook*)hook_data; EventsRequest *events_request = (EventsRequest*)th->hook_data; ControlFlowData *control_flow_data = events_request->viewer_data; @@ -1723,6 +1715,7 @@ int after_process_fork_hook(void *hook_data, void *call_data) } } return FALSE; +#endif //babel_cleanup } @@ -1740,6 +1733,7 @@ int after_process_fork_hook(void *hook_data, void *call_data) */ int after_process_exit_hook(void *hook_data, void *call_data) { +#ifdef BABEL_CLEANUP LttvTraceHook *th = (LttvTraceHook*)hook_data; EventsRequest *events_request = (EventsRequest*)th->hook_data; ControlFlowData *control_flow_data = events_request->viewer_data; @@ -1844,12 +1838,14 @@ int after_process_exit_hook(void *hook_data, void *call_data) } return FALSE; +#endif //babel_cleanup } /* Get the filename of the process to print */ int after_fs_exec_hook(void *hook_data, void *call_data) { +#ifdef BABEL_CLEANUP LttvTraceHook *th = (LttvTraceHook*)hook_data; EventsRequest *events_request = (EventsRequest*)th->hook_data; ControlFlowData *control_flow_data = events_request->viewer_data; @@ -1925,12 +1921,14 @@ int after_fs_exec_hook(void *hook_data, void *call_data) processlist_set_name(process_list, process->name, hashed_process_data); return 0; +#endif //babel_cleanup } /* Get the filename of the process to print */ int after_user_generic_thread_brand_hook(void *hook_data, void *call_data) { +#ifdef BABEL_CLEANUP LttvTraceHook *th = (LttvTraceHook*)hook_data; EventsRequest *events_request = (EventsRequest*)th->hook_data; ControlFlowData *control_flow_data = events_request->viewer_data; @@ -2006,7 +2004,7 @@ int after_user_generic_thread_brand_hook(void *hook_data, void *call_data) processlist_set_brand(process_list, process->brand, hashed_process_data); return 0; - +#endif //babel_cleanup } @@ -2023,6 +2021,7 @@ int after_user_generic_thread_brand_hook(void *hook_data, void *call_data) */ int after_event_enum_process_hook(void *hook_data, void *call_data) { +#ifdef BABEL_CLEANUP LttvTraceHook *th = (LttvTraceHook*)hook_data; EventsRequest *events_request = (EventsRequest*)th->hook_data; ControlFlowData *control_flow_data = events_request->viewer_data; @@ -2117,6 +2116,7 @@ int after_event_enum_process_hook(void *hook_data, void *call_data) } } return 0; +#endif //babel_cleanup } @@ -2426,10 +2426,11 @@ gint continue_notify(void *hook_data, void *call_data) gint update_current_time_hook(void *hook_data, void *call_data) { + ControlFlowData *control_flow_data = (ControlFlowData*)hook_data; LttTime current_time = *((LttTime*)call_data); - + TimeWindow time_window = lttvwindow_get_time_window(control_flow_data->tab); @@ -2443,11 +2444,11 @@ gint update_current_time_hook(void *hook_data, void *call_data) } LttTime time_end = ltt_time_add(time_begin, width); - LttvTracesetContext * tsc = - lttvwindow_get_traceset_context(control_flow_data->tab); + LttvTraceset * ts = lttvwindow_get_traceset(control_flow_data->tab); - LttTime trace_start = tsc->time_span.start_time; - LttTime trace_end = tsc->time_span.end_time; + TimeInterval time_span = lttv_traceset_get_time_span_real(ts); + LttTime trace_start = time_span.start_time; + LttTime trace_end = time_span.end_time; g_info("New current time HOOK : %lu, %lu", current_time.tv_sec, current_time.tv_nsec); @@ -2505,11 +2506,11 @@ gint update_current_time_hook(void *hook_data, void *call_data) TRUE); return 0; + } typedef struct _ClosureData { EventsRequest *events_request; - LttvTracesetState *tss; LttTime end_time; guint x_end; } ClosureData; @@ -2517,15 +2518,15 @@ typedef struct _ClosureData { 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; + LttvTraceset *ts = lttvwindow_get_traceset(control_flow_data->tab); - LttvTracesetState *tss = closure_data->tss; - LttvTracesetContext *tsc = (LttvTracesetContext*)tss; LttTime evtime = closure_data->end_time; @@ -2541,8 +2542,9 @@ void draw_closure(gpointer key, gpointer value, gpointer user_data) #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; + //TODO Fdeslauriers 2012-07-17: adapt for multiple traces + LttvTrace *trace = lttv_traceset_get(ts,0); + LttvTraceState *trace_state = trace->state; #if 0 //FIXME : optimize data structures. @@ -2559,22 +2561,22 @@ void draw_closure(gpointer key, gpointer value, gpointer user_data) g_assert(itracefiles->len); tfs = LTTV_TRACEFILE_STATE(tfc); #endif //0 - // LttvTracefileState *tfs = + // LttvTracefileState *tfs =ts // (LttvTracefileState*)tsc->traces[process_info->trace_num]-> // tracefiles[process_info->cpu]; LttvProcessState *process; - process = lttv_state_find_process(ts, process_info->cpu, + process = lttv_state_find_process(trace_state, process_info->cpu, process_info->pid); if(unlikely(process != NULL)) { - +#ifdef BABEL_CLEANUP 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; - +#endif //babel_cleanup /* Only draw for processes that are currently in the trace states */ #ifdef EXTRA_CHECK @@ -2679,8 +2681,9 @@ void draw_closure(gpointer key, gpointer value, gpointer user_data) int before_chunk(void *hook_data, void *call_data) { + EventsRequest *events_request = (EventsRequest*)hook_data; - LttvTracesetState *tss = (LttvTracesetState*)call_data; + LttvTraceset *ts = (LttvTraceset*)call_data; #if 0 /* Desactivate sort */ gtk_tree_sortable_set_sort_column_id( @@ -2688,19 +2691,20 @@ int before_chunk(void *hook_data, void *call_data) TRACE_COLUMN, GTK_SORT_ASCENDING); #endif //0 - drawing_chunk_begin(events_request, tss); + drawing_chunk_begin(events_request, ts); return 0; } int before_request(void *hook_data, void *call_data) { + EventsRequest *events_request = (EventsRequest*)hook_data; - LttvTracesetState *tss = (LttvTracesetState*)call_data; - drawing_data_request_begin(events_request, tss); + drawing_data_request_begin(events_request); return 0; + } @@ -2715,16 +2719,15 @@ int before_request(void *hook_data, void *call_data) */ 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 = @@ -2743,7 +2746,7 @@ int after_request(void *hook_data, void *call_data) /* Request expose */ - drawing_request_expose(events_request, tss, end_time); + drawing_request_expose(events_request, end_time); return 0; } @@ -2754,17 +2757,16 @@ int after_request(void *hook_data, void *call_data) */ int after_chunk(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; - LttvTracesetContext *tsc = (LttvTracesetContext*)call_data; - LttvTracefileContext *tfc = lttv_traceset_context_get_current_tfc(tsc); + LttvTraceset *ts = (LttvTraceset*)call_data; + LttTime end_time; ProcessList *process_list = control_flow_data->process_list; guint i; - LttvTraceset *traceset = tsc->ts; - guint nb_trace = lttv_traceset_number(traceset); + guint nb_trace = lttv_traceset_number(ts); /* Only execute when called for the first trace's events request */ if(!process_list->current_hash_data) @@ -2776,14 +2778,10 @@ int after_chunk(void *hook_data, void *call_data) g_free(process_list->current_hash_data); process_list->current_hash_data = NULL; - if(tfc != NULL) - end_time = LTT_TIME_MIN(tfc->timestamp, events_request->end_time); - else /* end of traceset, or position now out of request : end */ 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 = @@ -2810,8 +2808,8 @@ int after_chunk(void *hook_data, void *call_data) gtk_widget_queue_draw(control_flow_data->drawing->drawing_area); #endif //0 /* Request expose (updates damages zone also) */ - drawing_request_expose(events_request, tss, end_time); + drawing_request_expose(events_request, end_time); return 0; } @@ -2825,6 +2823,7 @@ int after_chunk(void *hook_data, void *call_data) */ int before_statedump_end(void *hook_data, void *call_data) { +#ifdef BABEL_CLEANUP LttvTraceHook *th = (LttvTraceHook*)hook_data; EventsRequest *events_request = (EventsRequest*)th->hook_data; ControlFlowData *control_flow_data = events_request->viewer_data; @@ -2877,4 +2876,5 @@ int before_statedump_end(void *hook_data, void *call_data) drawing_request_expose(events_request, tss, evtime); return 0; +#endif //babel_cleanup } diff --git a/lttv/modules/gui/controlflow/lttv_plugin_cfv.c b/lttv/modules/gui/controlflow/lttv_plugin_cfv.c index c9ea71eb..fc403a0e 100644 --- a/lttv/modules/gui/controlflow/lttv_plugin_cfv.c +++ b/lttv/modules/gui/controlflow/lttv_plugin_cfv.c @@ -34,7 +34,9 @@ static void cfv_update_filter(LttvPlugin *parent, LttvFilter *filter) { LttvPluginCFV *self = LTTV_PLUGIN_CFV(parent); g_message("In CFV update filter."); +#ifdef BABEL_CLEANUP lttv_filter_destroy(self->cfd->filter); +#endif //babel_cleanup self->cfd->filter = filter; redraw_notify(self->cfd, NULL); } diff --git a/lttv/modules/gui/detailedevents/events.c b/lttv/modules/gui/detailedevents/events.c index 8d18ced3..5f132321 100644 --- a/lttv/modules/gui/detailedevents/events.c +++ b/lttv/modules/gui/detailedevents/events.c @@ -1609,6 +1609,7 @@ static void event_update_selection(EventViewerData *event_viewer_data) if(path) { gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v), path, NULL, FALSE); + gtk_widget_grab_focus(event_viewer_data->tree_v ); gtk_tree_path_free(path); break; } @@ -1652,8 +1653,7 @@ gboolean update_current_time(void * hook_data, void * call_data) EventViewerData *event_viewer_data = (EventViewerData*) hook_data; const LttTime * current_time = (LttTime*)call_data; - LttvTraceset * ts = - lttvwindow_get_traceset(event_viewer_data->tab); + LttvTraceset * ts = lttvwindow_get_traceset(event_viewer_data->tab); /* If the currently selected event time != current time, set the first event * with this time as currently selected. */ @@ -1661,7 +1661,6 @@ gboolean update_current_time(void * hook_data, void * call_data) event_viewer_data->currently_selected_position); if(ltt_time_compare(pos_time, *current_time) != 0) { - /*create position*/ LttvTracesetPosition *currentPosition = lttv_traceset_create_time_position(ts,*current_time ); @@ -1670,8 +1669,6 @@ gboolean update_current_time(void * hook_data, void * call_data) event_viewer_data->currently_selected_position = lttv_traceset_create_current_position(ts); - - } event_viewer_data->report_position = FALSE; @@ -1740,7 +1737,7 @@ gboolean traceset_changed(void * hook_data, void * call_data) lttv_traceset_destroy_position(event_viewer_data->currently_selected_position); lttv_traceset_destroy_position(event_viewer_data->first_event); lttv_traceset_destroy_position(event_viewer_data->last_event); - + event_viewer_data->currently_selected_position = lttv_traceset_create_current_position(ts); event_viewer_data->first_event = @@ -1749,6 +1746,7 @@ gboolean traceset_changed(void * hook_data, void * call_data) lttv_traceset_create_current_position(ts); get_events(event_viewer_data->vadjust_c->value, event_viewer_data); + #endif //babel_cleanup // event_viewer_data->vadjust_c->value = 0; diff --git a/lttv/modules/gui/lttvwindow/lttvwindow/callbacks.c b/lttv/modules/gui/lttvwindow/lttvwindow/callbacks.c index bdb90e70..b3700268 100644 --- a/lttv/modules/gui/lttvwindow/lttvwindow/callbacks.c +++ b/lttv/modules/gui/lttvwindow/lttvwindow/callbacks.c @@ -1077,11 +1077,8 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) lttv_hooks_call(events_request->before_chunk_traceset, ts); - lttv_trace_add_hooks(trace, - events_request->before_chunk_trace, - - events_request->event - ); + lttv_trace_add_hooks(trace, events_request->before_chunk_trace, + events_request->event); } } } @@ -1117,7 +1114,6 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) lttv_trace_add_hooks(trace, events_request->before_chunk_trace, - events_request->event ); } @@ -2139,11 +2135,11 @@ void save_as(GtkWidget * widget, gpointer user_data) void zoom(GtkWidget * widget, double size) { -#ifdef BABEL_CLEANUP + TimeInterval time_span; TimeWindow new_time_window; LttTime current_time, time_delta; - LttvTracesetContext *tsc; + LttvTraceset *ts; GtkWidget * notebook = lookup_widget(widget, "MNotebook"); GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), @@ -2160,8 +2156,8 @@ void zoom(GtkWidget * widget, double size) if(size == 1) return; - tsc = LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context); - time_span = tsc->time_span; + ts = lttvwindow_get_traceset(tab); + time_span = lttv_traceset_get_time_span_real(ts); new_time_window = tab->time_window; current_time = tab->current_time; @@ -2223,8 +2219,6 @@ void zoom(GtkWidget * widget, double size) } else { time_change_manager(tab, new_time_window); } - -#endif /* BABEL_CLEANUP */ } void zoom_in(GtkWidget * widget, gpointer user_data) diff --git a/lttv/modules/gui/lttvwindow/lttvwindow/lttvwindow.c b/lttv/modules/gui/lttvwindow/lttvwindow/lttvwindow.c index d76ef629..53a1e5ab 100644 --- a/lttv/modules/gui/lttvwindow/lttvwindow/lttvwindow.c +++ b/lttv/modules/gui/lttvwindow/lttvwindow/lttvwindow.c @@ -1236,18 +1236,23 @@ __EXPORT LttvTraceset *lttvwindow_get_traceset(Tab *tab) void events_request_free(EventsRequest *events_request) { -#ifdef BABEL_CLEANUP + if(events_request == NULL) return; if(events_request->start_position != NULL) - lttv_traceset_context_position_destroy(events_request->start_position); + lttv_traceset_destroy_position(events_request->start_position); if(events_request->end_position != NULL) - lttv_traceset_context_position_destroy(events_request->end_position); - if(events_request->hooks != NULL) { + lttv_traceset_destroy_position(events_request->end_position); +#ifdef BABEL_CLEANUP + if(events_request->hooks != NULL) { GArray *hooks = events_request->hooks; + lttv_trace_hook_remove_all(&hooks); + g_array_free(events_request->hooks, TRUE); + } + if(events_request->before_chunk_traceset != NULL) lttv_hooks_destroy(events_request->before_chunk_traceset); if(events_request->before_chunk_trace != NULL) @@ -1256,8 +1261,6 @@ void events_request_free(EventsRequest *events_request) lttv_hooks_destroy(events_request->before_chunk_tracefile); if(events_request->event != NULL) lttv_hooks_destroy(events_request->event); - if(events_request->event_by_id_channel != NULL) - lttv_hooks_by_id_channel_destroy(events_request->event_by_id_channel); if(events_request->after_chunk_tracefile != NULL) lttv_hooks_destroy(events_request->after_chunk_tracefile); if(events_request->after_chunk_trace != NULL) @@ -1268,9 +1271,10 @@ void events_request_free(EventsRequest *events_request) lttv_hooks_destroy(events_request->before_request); if(events_request->after_request != NULL) lttv_hooks_destroy(events_request->after_request); - - g_free(events_request); #endif /*BABEL_CLEANUP*/ + g_free(events_request); + + } diff --git a/runlttv b/runlttv index ebb968f4..40e512ee 100755 --- a/runlttv +++ b/runlttv @@ -17,8 +17,8 @@ TEXTLIBS="-L ${BUILDPATH}/lttv/modules/text/.libs -m textDump" EVALLIBS="-L ${BUILDPATH}/lttv/modules/text/.libs -m sync_chain_batch" GRAPHLIBS="-L ${BUILDPATH}/lttv/modules/gui/lttvwindow/lttvwindow/.libs -m lttvwindow "\ "-L ${BUILDPATH}/lttv/modules/gui/detailedevents/.libs -m guievents "\ -"-L ${BUILDPATH}/lttv/modules/gui/histogram/.libs -m guihistogram" -#"-L ${BUILDPATH}/lttv/modules/gui/controlflow/.libs -m guicontrolflow "\ +"-L ${BUILDPATH}/lttv/modules/gui/histogram/.libs -m guihistogram "\ +"-L ${BUILDPATH}/lttv/modules/gui/controlflow/.libs -m guicontrolflow" #"-L ${BUILDPATH}/lttv/modules/gui/tracecontrol/.libs -m guitracecontrol "\ #"-L ${BUILDPATH}/lttv/modules/gui/statistics/.libs -m guistatistics "\ #"-L ${BUILDPATH}/lttv/modules/gui/resourceview/.libs -m resourceview "\