X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Fmodules%2Fgui%2Finterrupts%2Finterrupts.c;h=6d0f07e3a210fba5717f69c1147a52e2e82b35f2;hb=0305fe774206ec12a98378be3cf891446b1b901c;hp=e30cd9d18429535c8d53b2b36d52853308c7778f;hpb=31935b31213da098b6e34909ac18797cb95fd2ec;p=lttv.git diff --git a/ltt/branches/poly/lttv/modules/gui/interrupts/interrupts.c b/ltt/branches/poly/lttv/modules/gui/interrupts/interrupts.c index e30cd9d1..6d0f07e3 100644 --- a/ltt/branches/poly/lttv/modules/gui/interrupts/interrupts.c +++ b/ltt/branches/poly/lttv/modules/gui/interrupts/interrupts.c @@ -73,21 +73,19 @@ Xa: Frequency (Hz) #include #include #include -#include #include -#include #include #include #include #include #include #include +#include #include #include "hInterruptsInsert.xpm" #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 NO_ITEMS 0 typedef struct @@ -133,7 +131,7 @@ enum type_t { static GSList *interrupt_data_list = NULL ; -#define TRACE_NUMBER 0 +//fixed #define TRACE_NUMBER 0 typedef struct _InterruptEventData { @@ -145,6 +143,7 @@ typedef struct _InterruptEventData { GtkTreeSelection *SelectionTree; Tab * tab; /* tab that contains this plug-in*/ + LttvPluginTab *ptab; LttvHooks * event_hooks; LttvHooks * hooks_trace_after; LttvHooks * hooks_trace_before; @@ -162,11 +161,10 @@ typedef struct _InterruptEventData { /* Function prototypes */ static gboolean interrupt_update_time_window(void * hook_data, void * call_data); -static GtkWidget *interrupts(Tab *tab); -static InterruptEventData *system_info(Tab *tab); +static GtkWidget *interrupts(LttvPlugin *plugin); +static InterruptEventData *system_info(LttvPluginTab *ptab); void interrupt_destructor(InterruptEventData *event_viewer_data); static void FirstRequest(InterruptEventData *event_data ); -static guint64 get_interrupt_id(LttEvent *e); static gboolean trace_header(void *hook_data, void *call_data); static gboolean DisplayViewer (void *hook_data, void *call_data); static void CalculateData(LttTime time_exit, guint cpu_id, InterruptEventData *event_data); @@ -177,7 +175,7 @@ static gboolean SecondRequest(void *hook_data, void *call_data); static void CalculateAverageDurationForEachIrqId(InterruptEventData *event_data); static gboolean SecondRequestIrqEntryCallback(void *hook_data, void *call_data); static gboolean SecondRequestIrqExitCallback(void *hook_data, void *call_data); -static void CalculateXi(LttEvent *event, InterruptEventData *event_data); +static void CalculateXi(LttEvent *event, InterruptEventData *event_data, guint cpu_id); static void SumItems(gint irq_id, LttTime Xi, InterruptEventData *event_data); static int CalculateDurationStandardDeviation(gint id, InterruptEventData *event_data); static int CalculatePeriodStandardDeviation(gint id, InterruptEventData *event_data); @@ -227,10 +225,10 @@ static void init() { * Constructor hook * */ -static GtkWidget *interrupts(Tab * tab) +static GtkWidget *interrupts(LttvPlugin *plugin) { - - InterruptEventData* event_data = system_info(tab) ; + LttvPluginTab *ptab = LTTV_PLUGIN_TAB(plugin); + InterruptEventData* event_data = system_info(ptab) ; if(event_data) return event_data->Hbox; else @@ -241,14 +239,15 @@ static GtkWidget *interrupts(Tab * tab) * This function initializes the Event Viewer functionnality through the * GTK API. */ -InterruptEventData *system_info(Tab *tab) +InterruptEventData *system_info(LttvPluginTab *ptab) { LttTime end; GtkTreeViewColumn *column; GtkCellRenderer *renderer; InterruptEventData* event_viewer_data = g_new(InterruptEventData,1) ; - + Tab *tab = ptab->tab; + event_viewer_data->ptab = ptab; event_viewer_data->tab = tab; /*Get the current time frame from the main window */ @@ -433,7 +432,7 @@ static void FirstRequest(InterruptEventData *event_data ) EventsRequest *events_request; - LttvTraceHookByFacility *thf; + LttvTraceHook *th; LttvTracesetContext *tsc = lttvwindow_get_traceset_context(event_data->tab); @@ -444,13 +443,11 @@ static void FirstRequest(InterruptEventData *event_data ) nb_trace = lttv_traceset_number(traceset); /* There are many traces in a traceset. Iteration for each trace. */ - for(i = 0; ihooks_trace_before = lttv_hooks_new(); @@ -464,37 +461,34 @@ static void FirstRequest(InterruptEventData *event_data ) /* Get a trace state */ ts = (LttvTraceState *)tsc->traces[i]; /* Create event_by_Id hooks */ - event_data->event_by_id_hooks = lttv_hooks_by_id_new(); + event_data->event_by_id_hooks = lttv_hooks_by_id_new(); /*Register event_by_id_hooks with a callback function*/ - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL, LTT_EVENT_IRQ_ENTRY, - LTT_FIELD_IRQ_ID, 0, 0, + lttv_trace_find_hook(ts->parent.t, + LTT_FACILITY_KERNEL, + LTT_EVENT_IRQ_ENTRY, + FIELD_ARRAY(LTT_FIELD_IRQ_ID), FirstRequestIrqEntryCallback, events_request, - &g_array_index(hooks, LttvTraceHook, 0)); + &hooks); - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL, LTT_EVENT_IRQ_EXIT, - LTT_FIELD_IRQ_ID, 0, 0, + lttv_trace_find_hook(ts->parent.t, + LTT_FACILITY_KERNEL, + LTT_EVENT_IRQ_EXIT, + NULL, FirstRequestIrqExitCallback, events_request, - &g_array_index(hooks, LttvTraceHook, 1)); + &hooks); - g_assert(!ret); /*iterate through the facility list*/ for(k = 0 ; k < hooks->len; k++) { - hook = &g_array_index(hooks, LttvTraceHook, k); - for(l=0; lfac_list->len; l++) - { - thf = g_array_index(hook->fac_list, LttvTraceHookByFacility*, l); - lttv_hooks_add(lttv_hooks_by_id_find(event_data->event_by_id_hooks, thf->id), - thf->h, - event_data, - LTTV_PRIO_DEFAULT); + th = &g_array_index(hooks, LttvTraceHook, k); + lttv_hooks_add(lttv_hooks_by_id_find(event_data->event_by_id_hooks, th->id), + th->h, + th, + LTTV_PRIO_DEFAULT); - } } /* Initalize the EventsRequest structure */ events_request->owner = event_data; @@ -538,14 +532,16 @@ static gboolean FirstRequestIrqEntryCallback(void *hook_data, void *call_data) irq_entry entry; LttvTracefileContext *tfc = (LttvTracefileContext *)call_data; LttvTracefileState *tfs = (LttvTracefileState *)call_data; - InterruptEventData *event_data = (InterruptEventData *)hook_data; + LttvTraceHook *th = (LttvTraceHook*) hook_data; + EventsRequest *events_request = (EventsRequest*)th->hook_data; + InterruptEventData *event_data = events_request->viewer_data; GArray* FirstRequestIrqEntry = event_data->FirstRequestIrqEntry; LttEvent *e = ltt_tracefile_get_event(tfc->tf); event_time = ltt_event_time(e); - cpu_id = ltt_event_cpu_id(e); + cpu_id = tfs->cpu; - entry.id =get_interrupt_id(e); + entry.id = ltt_event_get_long_unsigned(e, lttv_trace_get_hook_field(th, 0)); entry.cpu_id = cpu_id; entry.event_time = event_time; g_array_append_val (FirstRequestIrqEntry, entry); @@ -553,27 +549,6 @@ static gboolean FirstRequestIrqEntryCallback(void *hook_data, void *call_data) return FALSE; } -/** - * This function gets the id of the interrupt. The id is stored in a dynamic structure. - * Refer to the print.c file for how to extract data from a dynamic structure. - */ -static guint64 get_interrupt_id(LttEvent *e) -{ - guint i, num_fields; - LttEventType *event_type; - LttField *element; - LttField *field; - guint64 irq_id; - event_type = ltt_event_eventtype(e); - num_fields = ltt_eventtype_num_fields(event_type); - for(i = 0 ; i < num_fields-1 ; i++) - { - field = ltt_eventtype_field(event_type, i); - irq_id = ltt_event_get_long_unsigned(e,field); - } - return irq_id; - -} /** * This function is called whenever an irq_exit event occurs. * @@ -584,11 +559,12 @@ gboolean FirstRequestIrqExitCallback(void *hook_data, void *call_data) unsigned cpu_id; LttvTracefileContext *tfc = (LttvTracefileContext *)call_data; LttvTracefileState *tfs = (LttvTracefileState *)call_data; - InterruptEventData *event_data = (InterruptEventData *)hook_data; + LttvTraceHook *th = (LttvTraceHook*) hook_data; + EventsRequest *events_request = (EventsRequest*)th->hook_data; + InterruptEventData *event_data = events_request->viewer_data; LttEvent *e = ltt_tracefile_get_event(tfc->tf); - LttEventType *type = ltt_event_eventtype(e); event_time = ltt_event_time(e); - cpu_id = ltt_event_cpu_id(e); + cpu_id = tfs->cpu; CalculateData( event_time, cpu_id, event_data); @@ -717,7 +693,7 @@ static gboolean SecondRequest(void *hook_data, void *call_data) EventsRequest *events_request; - LttvTraceHookByFacility *thf; + LttvTraceHook *th; InterruptEventData *event_data = (InterruptEventData *)hook_data; @@ -731,14 +707,12 @@ static gboolean SecondRequest(void *hook_data, void *call_data) nb_trace = lttv_traceset_number(traceset); /* There are many traces in a traceset. Iteration for each trace. */ - for(i = 0; ihooks_trace_after = lttv_hooks_new(); /* Registers a hook function */ @@ -751,34 +725,32 @@ static gboolean SecondRequest(void *hook_data, void *call_data) /*Register event_by_id_hooks with a callback function*/ ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL, LTT_EVENT_IRQ_ENTRY, - LTT_FIELD_IRQ_ID, 0, 0, + LTT_FACILITY_KERNEL, + LTT_EVENT_IRQ_ENTRY, + FIELD_ARRAY(LTT_FIELD_IRQ_ID), SecondRequestIrqEntryCallback, events_request, - &g_array_index(hooks, LttvTraceHook, 0)); + &hooks); ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL, LTT_EVENT_IRQ_EXIT, - LTT_FIELD_IRQ_ID, 0, 0, + LTT_FACILITY_KERNEL, + LTT_EVENT_IRQ_EXIT, + NULL, SecondRequestIrqExitCallback, events_request, - &g_array_index(hooks, LttvTraceHook, 1)); + &hooks); g_assert(!ret); /* iterate through the facility list */ for(k = 0 ; k < hooks->len; k++) { - hook = &g_array_index(hooks, LttvTraceHook, k); - for(l=0; lfac_list->len; l++) - { - thf = g_array_index(hook->fac_list, LttvTraceHookByFacility*, l); - lttv_hooks_add(lttv_hooks_by_id_find(event_data->event_by_id_hooks, thf->id), - thf->h, - event_data, - LTTV_PRIO_DEFAULT); + th = &g_array_index(hooks, LttvTraceHook, k); + lttv_hooks_add(lttv_hooks_by_id_find(event_data->event_by_id_hooks, th->id), + th->h, + th, + LTTV_PRIO_DEFAULT); - } } /* Initalize the EventsRequest structure */ events_request->owner = event_data; @@ -846,14 +818,16 @@ static gboolean SecondRequestIrqEntryCallback(void *hook_data, void *call_data) irq_entry entry; LttvTracefileContext *tfc = (LttvTracefileContext *)call_data; LttvTracefileState *tfs = (LttvTracefileState *)call_data; - InterruptEventData *event_data = (InterruptEventData *)hook_data; + LttvTraceHook *th = (LttvTraceHook *)hook_data; + EventsRequest *events_request = (EventsRequest*)th->hook_data; + InterruptEventData *event_data = events_request->viewer_data; GArray* SecondRequestIrqEntry = event_data->SecondRequestIrqEntry; LttEvent *e = ltt_tracefile_get_event(tfc->tf); event_time = ltt_event_time(e); - cpu_id = ltt_event_cpu_id(e); + cpu_id = tfs->cpu; - entry.id =get_interrupt_id(e); + entry.id = ltt_event_get_long_unsigned(e, lttv_trace_get_hook_field(th, 0)); entry.cpu_id = cpu_id; entry.event_time = event_time; g_array_append_val (SecondRequestIrqEntry, entry); @@ -870,10 +844,13 @@ static gboolean SecondRequestIrqExitCallback(void *hook_data, void *call_data) LttvTracefileContext *tfc = (LttvTracefileContext *)call_data; LttvTracefileState *tfs = (LttvTracefileState *)call_data; - InterruptEventData *event_data = (InterruptEventData *)hook_data; + LttvTraceHook *th = (LttvTraceHook *)hook_data; + EventsRequest *events_request = (EventsRequest*)th->hook_data; + InterruptEventData *event_data = events_request->viewer_data; + LttEvent *event = ltt_tracefile_get_event(tfc->tf); - CalculateXi(event, event_data); + CalculateXi(event, event_data, tfs->cpu); return FALSE; } @@ -882,17 +859,15 @@ static gboolean SecondRequestIrqExitCallback(void *hook_data, void *call_data) * This function is called whenever an irq_exit event occurs in the second request. * */ -static void CalculateXi(LttEvent *event_irq_exit, InterruptEventData *event_data) +static void CalculateXi(LttEvent *event_irq_exit, InterruptEventData *event_data, guint cpu_id) { gint i, irq_id; irq_entry *element; LttTime Xi; LttTime exit_time; - unsigned cpu_id; GArray *SecondRequestIrqExit = event_data->SecondRequestIrqExit; GArray *SecondRequestIrqEntry = event_data->SecondRequestIrqEntry; - cpu_id = ltt_event_cpu_id(event_irq_exit); for(i = 0; i < SecondRequestIrqEntry->len; i++) { element = &g_array_index(SecondRequestIrqEntry,irq_entry,i); @@ -1089,10 +1064,7 @@ static gboolean DisplayViewer(void *hook_data, void *call_data) AVERAGE_PERIOD , periodInNsec, PERIOD_STANDARD_DEV_COLUMN, CalculatePeriodStandardDeviation(element.id, event_data), FREQUENCY_STANDARD_DEV_COLUMN, CalculateFrequencyStandardDeviation(element.id, event_data), - -1); - printf("%d %d %lld %d %s %d %d %d\n\n",element.id, FrequencyHZ,real_data,CalculateDurationStandardDeviation(element.id, event_data), maxIrqHandler, periodInNsec, CalculatePeriodStandardDeviation(element.id, event_data), CalculateFrequencyStandardDeviation(element.id, event_data)); - - + -1); }