X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=lttv%2Flttv%2Fstate.c;h=2dde6de62a0ff2f5ddf85b417753ac7b90a071e7;hb=068572ab11edc234542b5535259eb43db02df7ee;hp=d65ee57f67ef5c78f0cdc11dcdd9b85eb11a687f;hpb=8f31828398b8a4fcdb679324291132f4f0e3dce6;p=lttv.git diff --git a/lttv/lttv/state.c b/lttv/lttv/state.c index d65ee57f..2dde6de6 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, @@ -232,7 +234,7 @@ static void bdevstate_free_cb(gpointer key, gpointer value, gpointer user_data); static LttvBdevState *bdevstate_copy(LttvBdevState *bds); -#if (__SIZEOF_LONG__ == 4) +#if (__WORDSIZE == 32) guint guint64_hash(gconstpointer key) { guint64 ukey = *(const guint64 *)key; @@ -355,7 +357,7 @@ static void expand_syscall_table(LttvTraceState *ts, int id) static void expand_kprobe_table(LttvTraceState *ts, guint64 ip, char *symbol) { LttvNameTables *nt = ts->name_tables; -#if (__SIZEOF_LONG__ == 4) +#if (__WORDSIZE == 32) guint64 *ip_ptr = g_new(guint64, 1); g_hash_table_insert(nt->kprobe_hash, ip_ptr, (gpointer)(glong)g_quark_from_string(symbol)); @@ -2085,7 +2087,7 @@ create_name_tables(LttvTraceState *tcs) g_string_free(fe_name, TRUE); -#if (__SIZEOF_LONG__ == 4) +#if (__WORDSIZE == 32) name_tables->kprobe_hash = g_hash_table_new_full(guint64_hash, guint64_equal, g_free, NULL); #else @@ -2933,6 +2935,32 @@ 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; + LttvProcessState *process; + + LttEvent *e = ltt_tracefile_get_event(s->parent.tf); + LttvTraceHook *th = (LttvTraceHook *)hook_data; + 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");