X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Flttv%2Fstate.c;h=6aae5ad9e6658c7655d4a7f6e5b7f2824b67953c;hb=da5d36a50b831b928c945ff2ab29767dc8de33a9;hp=6dd2663f10bd49d1fd51ad1bab614e3ca30b97ac;hpb=c3b3b60b2678520d2d80f1f88277d1d58068891a;p=lttv.git diff --git a/ltt/branches/poly/lttv/lttv/state.c b/ltt/branches/poly/lttv/lttv/state.c index 6dd2663f..6aae5ad9 100644 --- a/ltt/branches/poly/lttv/lttv/state.c +++ b/ltt/branches/poly/lttv/lttv/state.c @@ -1355,7 +1355,9 @@ typedef struct _LttvNameTables { GQuark *trap_names; guint nb_traps; GQuark *irq_names; + guint nb_irqs; GQuark *soft_irq_names; + guint nb_softirqs; } LttvNameTables; @@ -1413,6 +1415,12 @@ create_name_tables(LttvTraceState *tcs) for(i = 0 ; i < nb ; i++) { name_tables->syscall_names[i] = ltt_enum_string_get(t, i); + if(!name_tables->syscall_names[i]) { + GString *string = g_string_new(""); + g_string_printf(string, "syscall %u", i); + name_tables->syscall_names[i] = g_quark_from_string(string->str); + g_string_free(string, TRUE); + } } //name_tables->syscall_names = g_new(GQuark, 256); @@ -1474,12 +1482,14 @@ create_name_tables(LttvTraceState *tcs) } */ + name_tables->nb_irqs = 256; name_tables->irq_names = g_new(GQuark, 256); for(i = 0 ; i < 256 ; i++) { g_string_printf(fe_name, "irq %d", i); name_tables->irq_names[i] = g_quark_from_string(fe_name->str); } } else { + name_tables->nb_irqs = 0; name_tables->irq_names = NULL; } /* @@ -1489,6 +1499,7 @@ create_name_tables(LttvTraceState *tcs) } */ + name_tables->nb_softirqs = 256; name_tables->soft_irq_names = g_new(GQuark, 256); for(i = 0 ; i < 256 ; i++) { g_string_printf(fe_name, "softirq %d", i); @@ -1518,6 +1529,8 @@ get_name_tables(LttvTraceState *tcs) tcs->nb_traps = name_tables->nb_traps; tcs->irq_names = name_tables->irq_names; tcs->soft_irq_names = name_tables->soft_irq_names; + tcs->nb_irqs = name_tables->nb_irqs; + tcs->nb_softirqs = name_tables->nb_softirqs; } @@ -1943,9 +1956,19 @@ static gboolean irq_entry(void *hook_data, void *call_data) LttField *f = thf->f1; LttvExecutionSubmode submode; + guint64 irq = ltt_event_get_unsigned(e, f); + guint64 nb_irqs = ((LttvTraceState *)(s->parent.t_context))->nb_irqs; + GString *string; - submode = ((LttvTraceState *)(s->parent.t_context))->irq_names[ - ltt_event_get_unsigned(e, f)]; + if(irq < nb_irqs) { + submode = ((LttvTraceState *)(s->parent.t_context))->irq_names[irq]; + } else { + /* Fixup an incomplete irq table */ + GString *string = g_string_new(""); + g_string_printf(string, "irq %llu", irq); + submode = g_quark_from_string(string->str); + g_string_free(string, TRUE); + } /* Do something with the info about being in user or system mode when int? */ push_state(s, LTTV_STATE_IRQ, submode); @@ -1983,9 +2006,19 @@ static gboolean soft_irq_entry(void *hook_data, void *call_data) LttField *f = thf->f1; LttvExecutionSubmode submode; + guint64 softirq = ltt_event_get_unsigned(e, f); + guint64 nb_softirqs = ((LttvTraceState *)(s->parent.t_context))->nb_softirqs; + GString *string; - submode = ((LttvTraceState *)(s->parent.t_context))->soft_irq_names[ - ltt_event_get_long_unsigned(e, f)]; + if(softirq < nb_softirqs) { + submode = ((LttvTraceState *)(s->parent.t_context))->soft_irq_names[softirq]; + } else { + /* Fixup an incomplete irq table */ + GString *string = g_string_new(""); + g_string_printf(string, "softirq %llu", softirq); + submode = g_quark_from_string(string->str); + g_string_free(string, TRUE); + } /* Do something with the info about being in user or system mode when int? */ push_state(s, LTTV_STATE_SOFT_IRQ, submode); @@ -2359,19 +2392,19 @@ static void fix_process(gpointer key, gpointer value, LttvTracefileContext *tfc = (LttvTracefileContext *)user_data; LttTime *timestamp = (LttTime*)user_data; -printf("%s %s\n", g_quark_to_string(process->type), g_quark_to_string(process->state->t)); - if(process->type == LTTV_STATE_KERNEL_THREAD) { - if(process->state->t == LTTV_STATE_MODE_UNKNOWN) { - process->state->t = LTTV_STATE_SYSCALL; - process->state->s = LTTV_STATE_WAIT; - process->state->n = LTTV_STATE_SUBMODE_NONE; + es = &g_array_index(process->execution_stack, LttvExecutionState, 0); + if(es->t == LTTV_STATE_MODE_UNKNOWN) { + es->t = LTTV_STATE_SYSCALL; + es->s = LTTV_STATE_WAIT; + es->n = LTTV_STATE_SUBMODE_NONE; + es->entry = *timestamp; + es->change = *timestamp; + es->cum_cpu_time = ltt_time_zero; } } else { - if(process->state->t == LTTV_STATE_MODE_UNKNOWN) { - process->execution_stack = g_array_set_size(process->execution_stack, 2); - es = process->state = &g_array_index(process->execution_stack, - LttvExecutionState, 0); + es = &g_array_index(process->execution_stack, LttvExecutionState, 0); + if(es->t == LTTV_STATE_MODE_UNKNOWN) { es->t = LTTV_STATE_USER_MODE; es->n = LTTV_STATE_SUBMODE_NONE; es->entry = *timestamp; @@ -2380,15 +2413,20 @@ printf("%s %s\n", g_quark_to_string(process->type), g_quark_to_string(process->s es->cum_cpu_time = ltt_time_zero; es->s = LTTV_STATE_RUN; - es = process->state = &g_array_index(process->execution_stack, + if(process->execution_stack->len == 1) { + /* Still in user mode, means never scheduled */ + process->execution_stack = + g_array_set_size(process->execution_stack, 2); + es = process->state = &g_array_index(process->execution_stack, LttvExecutionState, 1); - es->t = LTTV_STATE_SYSCALL; - es->n = LTTV_STATE_SUBMODE_NONE; - es->entry = *timestamp; - //g_assert(timestamp->tv_sec != 0); - es->change = *timestamp; - es->cum_cpu_time = ltt_time_zero; - es->s = LTTV_STATE_WAIT; + es->t = LTTV_STATE_SYSCALL; + es->n = LTTV_STATE_SUBMODE_NONE; + es->entry = *timestamp; + //g_assert(timestamp->tv_sec != 0); + es->change = *timestamp; + es->cum_cpu_time = ltt_time_zero; + es->s = LTTV_STATE_WAIT; + } } } }