X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=lttv%2Flttv%2Fstate.c;h=27adae2c1abdd1a22322621c79bcee799411e286;hb=d5b038ec901e9753a8569f33516a49361c54254c;hp=5c6f77c095c6f331d85183bc2f3653fcfa54b148;hpb=e9a5b51409e5694eac4454885ea66b037e169b1d;p=lttv.git diff --git a/lttv/lttv/state.c b/lttv/lttv/state.c index 5c6f77c0..27adae2c 100644 --- a/lttv/lttv/state.c +++ b/lttv/lttv/state.c @@ -136,7 +136,9 @@ GQuark LTT_FIELD_ADDRESS, LTT_FIELD_SYMBOL, LTT_FIELD_IP, - LTT_FIELD_FD; + LTT_FIELD_FD, + LTT_FIELD_STATE, + LTT_FIELD_CPU_ID; LttvExecutionMode LTTV_STATE_MODE_UNKNOWN, @@ -2055,10 +2057,12 @@ create_name_tables(LttvTraceState *tcs) name_tables->irq_names[i] = g_quark_from_string(ltt_enum_string_get(t, i)); } */ + /* FIXME: LttvIRQState *irq_states should become a g_array */ + /* temp fix: increase from 256 to 512 default size */ - name_tables->nb_irqs = 256; - name_tables->irq_names = g_new(GQuark, 256); - for(i = 0 ; i < 256 ; i++) { + name_tables->nb_irqs = 512; + name_tables->irq_names = g_new(GQuark, 512); + for(i = 0 ; i < 512 ; i++) { g_string_printf(fe_name, "irq %d", i); name_tables->irq_names[i] = g_quark_from_string(fe_name->str); } @@ -2933,6 +2937,30 @@ static gboolean dump_softirq(void *hook_data, void *call_data) return FALSE; } +static gboolean sched_try_wakeup(void *hook_data, void *call_data) +{ + LttvTracefileState *s = (LttvTracefileState *)call_data; + LttEvent *e = ltt_tracefile_get_event(s->parent.tf); + LttvTraceHook *th = (LttvTraceHook *)hook_data; + LttvProcessState *process; + gint woken_pid; + guint woken_cpu; + + woken_pid = ltt_event_get_int(e, lttv_trace_get_hook_field(th, 0)); + woken_cpu = ltt_event_get_unsigned(e, lttv_trace_get_hook_field(th, 1)); + + process = lttv_state_find_process_or_create( + (LttvTraceState*)s->parent.t_context, + woken_cpu, woken_pid, + &s->parent.timestamp); + process->state->s = LTTV_STATE_WAIT_CPU; + process->state->change = s->parent.timestamp; + + g_debug("Wakeup: process %d on CPU %u\n", woken_pid, woken_cpu); + + return FALSE; +} + static gboolean schedchange(void *hook_data, void *call_data) { LttvTracefileState *s = (LttvTracefileState *)call_data; @@ -3638,6 +3666,12 @@ void lttv_state_add_event_hooks(LttvTracesetState *self) LTT_FIELD_PREV_STATE), schedchange, NULL, &hooks); + lttv_trace_find_hook(ts->parent.t, + LTT_CHANNEL_KERNEL, + LTT_EVENT_SCHED_TRY_WAKEUP, + FIELD_ARRAY(LTT_FIELD_PID, LTT_FIELD_CPU_ID, LTT_FIELD_STATE), + sched_try_wakeup, NULL, &hooks); + lttv_trace_find_hook(ts->parent.t, LTT_CHANNEL_KERNEL, LTT_EVENT_PROCESS_FORK, @@ -4484,6 +4518,8 @@ static void module_init() LTT_FIELD_SYMBOL = g_quark_from_string("symbol"); LTT_FIELD_IP = g_quark_from_string("ip"); LTT_FIELD_FD = g_quark_from_string("fd"); + LTT_FIELD_STATE = g_quark_from_string("state"); + LTT_FIELD_CPU_ID = g_quark_from_string("cpu_id"); LTTV_CPU_UNKNOWN = g_quark_from_string("unknown"); LTTV_CPU_IDLE = g_quark_from_string("idle");