X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Flttv%2Fstate.c;h=e5b4f9bf251af8719ff6c1b3ccf2176effb353e8;hb=4aee92ee9eae6390f507c7ae061f28f6a208ac08;hp=ecbf7ec59d4238087c162f83061eb0b40e37a661;hpb=eb8871e7807eb640a853e6c5fc2eecb937c34314;p=lttv.git diff --git a/ltt/branches/poly/lttv/lttv/state.c b/ltt/branches/poly/lttv/lttv/state.c index ecbf7ec5..e5b4f9bf 100644 --- a/ltt/branches/poly/lttv/lttv/state.c +++ b/ltt/branches/poly/lttv/lttv/state.c @@ -268,6 +268,105 @@ gboolean rettrue(gpointer key, gpointer value, gpointer user_data) return TRUE; } +static guint check_expand(nb, id) +{ + if(likely(nb > id)) + return nb; + else + return max(id + 1, nb * 2); +} + +static void expand_name_table(LttvTraceState *ts, GQuark **table, + guint nb, guint new_nb) +{ + /* Expand an incomplete table */ + GQuark *old_table = *table; + *table = g_new(GQuark, new_nb); + memcpy(*table, old_table, nb * sizeof(GQuark)); +} + +static void fill_name_table(LttvTraceState *ts, GQuark *table, guint nb, + guint new_nb, const char *def_string) +{ + guint i; + GString *fe_name = g_string_new(""); + for(i = nb; i < new_nb; i++) { + g_string_printf(fe_name, "%s %d", def_string, i); + table[i] = g_quark_from_string(fe_name->str); + } + g_string_free(fe_name, TRUE); +} + +static void expand_syscall_table(LttvTraceState *ts, int id) +{ + guint new_nb = check_expand(ts->nb_syscalls, id); + if(likely(new_nb == ts->nb_syscalls)) + return; + expand_name_table(ts, &ts->syscall_names, ts->nb_syscalls, new_nb); + fill_name_table(ts, ts->syscall_names, ts->nb_syscalls, new_nb, "syscall"); + /* Update the table size */ + ts->nb_syscalls = new_nb; +} + +static void expand_trap_table(LttvTraceState *ts, int id) +{ + guint new_nb = check_expand(ts->nb_traps, id); + guint i; + if(likely(new_nb == ts->nb_traps)) + return; + expand_name_table(ts, &ts->trap_names, ts->nb_traps, new_nb); + fill_name_table(ts, ts->trap_names, ts->nb_traps, new_nb, "trap"); + /* Update the table size */ + ts->nb_traps = new_nb; + + LttvTrapState *old_table = ts->trap_states; + ts->trap_states = g_new(LttvTrapState, new_nb); + memcpy(ts->trap_states, old_table, + ts->nb_traps * sizeof(LttvTrapState)); + for(i = ts->nb_traps; i < new_nb; i++) + ts->trap_states[i].running = 0; +} + +static void expand_irq_table(LttvTraceState *ts, int id) +{ + guint new_nb = check_expand(ts->nb_irqs, id); + guint i; + if(likely(new_nb == ts->nb_irqs)) + return; + expand_name_table(ts, &ts->irq_names, ts->nb_irqs, new_nb); + fill_name_table(ts, ts->irq_names, ts->nb_irqs, new_nb, "irq"); + + LttvIRQState *old_table = ts->irq_states; + ts->irq_states = g_new(LttvIRQState, new_nb); + memcpy(ts->irq_states, old_table, ts->nb_irqs * sizeof(LttvIRQState)); + for(i = ts->nb_irqs; i < new_nb; i++) { + ts->irq_states[i].mode_stack = g_array_new(FALSE, FALSE, sizeof(LttvIRQMode)); + } + + /* Update the table size */ + ts->nb_irqs = new_nb; +} + +static void expand_soft_irq_table(LttvTraceState *ts, int id) +{ + guint new_nb = check_expand(ts->nb_soft_irqs, id); + guint i; + if(likely(new_nb == ts->nb_soft_irqs)) + return; + expand_name_table(ts, &ts->soft_irq_names, ts->nb_soft_irqs, new_nb); + fill_name_table(ts, ts->soft_irq_names, ts->nb_soft_irqs, new_nb, "softirq"); + + LttvSoftIRQState *old_table = ts->soft_irq_states; + ts->soft_irq_states = g_new(LttvSoftIRQState, new_nb); + memcpy(ts->soft_irq_states, old_table, + ts->nb_soft_irqs * sizeof(LttvSoftIRQState)); + for(i = ts->nb_soft_irqs; i < new_nb; i++) + ts->soft_irq_states[i].running = 0; + + /* Update the table size */ + ts->nb_soft_irqs = new_nb; +} + static void restore_init_state(LttvTraceState *self) { @@ -1171,7 +1270,7 @@ static LttvCPUState *lttv_state_copy_cpu_states(LttvCPUState *states, guint n) guint i,j; LttvCPUState *retval; - retval = g_malloc(n*sizeof(LttvCPUState)); + retval = g_new(LttvCPUState, n); for(i=0; ibdev_states, &devcode_gint); if(bdev == NULL) { - LttvBdevState *bdevstate = g_malloc(sizeof(LttvBdevState)); + LttvBdevState *bdevstate = g_new(LttvBdevState, 1); bdevstate->mode_stack = g_array_new(FALSE, FALSE, sizeof(GQuark)); - gint * key = g_malloc(sizeof(gint)); + gint * key = g_new(gint, 1); *key = devcode; g_hash_table_insert(ts->bdev_states, key, bdevstate); @@ -1286,7 +1385,7 @@ static LttvBdevState *get_hashed_bdevstate(LttvTraceState *ts, guint16 devcode) static LttvBdevState *bdevstate_new(void) { LttvBdevState *retval; - retval = g_malloc(sizeof(LttvBdevState)); + retval = g_new(LttvBdevState, 1); retval->mode_stack = g_array_new(FALSE, FALSE, sizeof(GQuark)); return retval; @@ -2290,28 +2389,10 @@ static gboolean syscall_entry(void *hook_data, void *call_data) LttEvent *e = ltt_tracefile_get_event(s->parent.tf); LttvTraceHook *th = (LttvTraceHook *)hook_data; struct marker_field *f = lttv_trace_get_hook_field(th, 0); - LttvExecutionSubmode submode; - guint nb_syscalls = ((LttvTraceState *)(s->parent.t_context))->nb_syscalls; guint syscall = ltt_event_get_unsigned(e, f); - - if(nb_syscalls <= syscall) { - /* Fixup an incomplete syscall table */ - GQuark *old_names = ts->syscall_names; - guint new_nb_syscalls = max(syscall + 1, ts->nb_syscalls * 2); - guint i; - GString *fe_name = g_string_new(""); - ts->syscall_names = g_new(GQuark, new_nb_syscalls); - memcpy(ts->syscall_names, old_names, - ts->nb_syscalls * sizeof(GQuark)); - for(i = ts->nb_syscalls ; i < new_nb_syscalls ; i++) { - g_string_printf(fe_name, "syscall %d", i); - ts->syscall_names[i] = g_quark_from_string(fe_name->str); - } - g_string_free(fe_name, TRUE); - ts->nb_syscalls = new_nb_syscalls; - } + expand_syscall_table(ts, syscall); submode = ((LttvTraceState *)(s->parent.t_context))->syscall_names[syscall]; /* There can be no system call from PID 0 : unknown state */ if(process->pid != 0) @@ -2346,22 +2427,8 @@ static gboolean trap_entry(void *hook_data, void *call_data) guint64 trap = ltt_event_get_long_unsigned(e, f); - if (unlikely(ts->nb_traps <= trap)) { - /* Fixup an incomplete trap table */ - GQuark *old_names = ts->trap_names; - guint new_nb_traps = max(trap + 1, ts->nb_traps * 2); - guint i; - GString *fe_name = g_string_new(""); - ts->trap_names = g_new(GQuark, new_nb_traps); - memcpy(ts->trap_names, old_names, - ts->nb_traps * sizeof(GQuark)); - for(i = ts->nb_traps ; i < new_nb_traps ; i++) { - g_string_printf(fe_name, "trap %d", i); - ts->trap_names[i] = g_quark_from_string(fe_name->str); - } - g_string_free(fe_name, TRUE); - ts->nb_traps = new_nb_traps; - } + expand_trap_table(ts, trap); + submode = ((LttvTraceState *)(s->parent.t_context))->trap_names[trap]; push_state(s, LTTV_STATE_TRAP, submode); @@ -2406,22 +2473,8 @@ static gboolean irq_entry(void *hook_data, void *call_data) LttvExecutionSubmode submode; guint64 irq = ltt_event_get_long_unsigned(e, f); - if (unlikely(ts->nb_irqs <= irq)) { - /* Fixup an incomplete irq table */ - GQuark *old_names = ts->irq_names; - guint new_nb_irqs = max(irq + 1, ts->nb_irqs * 2); - guint i; - GString *fe_name = g_string_new(""); - ts->irq_names = g_new(GQuark, new_nb_irqs); - memcpy(ts->irq_names, old_names, - ts->nb_irqs * sizeof(GQuark)); - for(i = ts->nb_irqs ; i < new_nb_irqs ; i++) { - g_string_printf(fe_name, "irq %d", i); - ts->irq_names[i] = g_quark_from_string(fe_name->str); - } - g_string_free(fe_name, TRUE); - ts->nb_irqs = new_nb_irqs; - } + expand_irq_table(ts, irq); + submode = ((LttvTraceState *)(s->parent.t_context))->irq_names[irq]; /* Do something with the info about being in user or system mode when int? */ @@ -2479,27 +2532,9 @@ static gboolean soft_irq_entry(void *hook_data, void *call_data) //guint8 ev_id = ltt_event_eventtype_id(e); LttvTraceHook *th = (LttvTraceHook *)hook_data; struct marker_field *f = lttv_trace_get_hook_field(th, 0); - LttvExecutionSubmode submode; guint64 softirq = ltt_event_get_long_unsigned(e, f); - guint64 nb_softirqs = ((LttvTraceState *)(s->parent.t_context))->nb_soft_irqs; - - if (unlikely(nb_softirqs <= softirq)) { - /* Fixup an incomplete softirq table */ - GQuark *old_names = ts->soft_irq_names; - guint new_nb_soft_irqs = max(softirq + 1, ts->nb_soft_irqs * 2); - guint i; - GString *fe_name = g_string_new(""); - ts->soft_irq_names = g_new(GQuark, new_nb_soft_irqs); - memcpy(ts->soft_irq_names, old_names, - ts->nb_soft_irqs * sizeof(GQuark)); - for(i = ts->nb_soft_irqs ; i < new_nb_soft_irqs ; i++) { - g_string_printf(fe_name, "softirq %d", i); - ts->soft_irq_names[i] = g_quark_from_string(fe_name->str); - } - g_string_free(fe_name, TRUE); - ts->nb_soft_irqs = new_nb_soft_irqs; - } + expand_soft_irq_table(ts, softirq); submode = ((LttvTraceState *)(s->parent.t_context))->soft_irq_names[softirq]; /* Do something with the info about being in user or system mode when int? */ @@ -2527,21 +2562,7 @@ static gboolean enum_interrupt(void *hook_data, void *call_data) lttv_trace_get_hook_field(th, 0))); guint irq = ltt_event_get_long_unsigned(e, lttv_trace_get_hook_field(th, 1)); - if (ts->nb_irqs <= irq) { - GQuark *old_names = ts->irq_names; - guint new_nb_irqs = max(irq + 1, ts->nb_irqs * 2); - guint i; - GString *fe_name = g_string_new(""); - ts->irq_names = g_new(GQuark, new_nb_irqs); - memcpy(ts->irq_names, old_names, - ts->nb_irqs * sizeof(GQuark)); - for(i = ts->nb_irqs ; i < new_nb_irqs ; i++) { - g_string_printf(fe_name, "irq %d", i); - ts->irq_names[i] = g_quark_from_string(fe_name->str); - } - g_string_free(fe_name, TRUE); - ts->nb_irqs = new_nb_irqs; - } + expand_irq_table(ts, irq); ts->irq_names[irq] = action; return FALSE; @@ -2691,21 +2712,7 @@ static gboolean dump_syscall(void *hook_data, void *call_data) address = ltt_event_get_long_unsigned(e, lttv_trace_get_hook_field(th, 1)); symbol = ltt_event_get_string(e, lttv_trace_get_hook_field(th, 2)); - if (ts->nb_syscalls <= id) { - GQuark *old_names = ts->syscall_names; - guint new_nb_syscalls = max(id + 1, ts->nb_syscalls * 2); - guint i; - GString *fe_name = g_string_new(""); - ts->syscall_names = g_new(GQuark, new_nb_syscalls); - memcpy(ts->syscall_names, old_names, - ts->nb_syscalls * sizeof(GQuark)); - for(i = ts->nb_syscalls ; i < new_nb_syscalls ; i++) { - g_string_printf(fe_name, "syscall %d", i); - ts->syscall_names[i] = g_quark_from_string(fe_name->str); - } - g_string_free(fe_name, TRUE); - ts->nb_syscalls = new_nb_syscalls; - } + expand_syscall_table(ts, id); ts->syscall_names[id] = g_quark_from_string(symbol); return FALSE; @@ -2725,23 +2732,7 @@ static gboolean dump_softirq(void *hook_data, void *call_data) address = ltt_event_get_long_unsigned(e, lttv_trace_get_hook_field(th, 1)); symbol = ltt_event_get_string(e, lttv_trace_get_hook_field(th, 2)); - if (ts->nb_soft_irqs <= id) { - /* Fixup an incomplete softirq table */ - GQuark *old_names = ts->soft_irq_names; - guint new_nb_soft_irqs = max(id + 1, ts->nb_soft_irqs * 2); - guint i; - GString *fe_name = g_string_new(""); - ts->soft_irq_names = g_new(GQuark, new_nb_soft_irqs); - memcpy(ts->soft_irq_names, old_names, - ts->nb_soft_irqs * sizeof(GQuark)); - for(i = ts->nb_soft_irqs ; i < new_nb_soft_irqs ; i++) { - g_string_printf(fe_name, "softirq %d", i); - ts->soft_irq_names[i] = g_quark_from_string(fe_name->str); - } - g_string_free(fe_name, TRUE); - ts->nb_soft_irqs = new_nb_soft_irqs; - } - + expand_soft_irq_table(ts, id); ts->soft_irq_names[id] = g_quark_from_string(symbol); return FALSE;