X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Flttv%2Fstate.c;h=ff388014da07c0e7a28bfd7399f5b24702d0b279;hb=44ffb95f70cba788a3bfcccabd60bb0e2bad0f1b;hp=00c37cb86149d5166749e71d9fe4c83962d87b51;hpb=f63ebe5196f36fcf40385d29cfc37288c4d70817;p=lttv.git diff --git a/ltt/branches/poly/lttv/lttv/state.c b/ltt/branches/poly/lttv/lttv/state.c index 00c37cb8..ff388014 100644 --- a/ltt/branches/poly/lttv/lttv/state.c +++ b/ltt/branches/poly/lttv/lttv/state.c @@ -127,6 +127,11 @@ LttvProcessType LTTV_STATE_USER_THREAD, LTTV_STATE_KERNEL_THREAD; +LttvCPUMode + LTTV_CPU_UNKNOWN, + LTTV_CPU_IDLE, + LTTV_CPU_BUSY; + static GQuark LTTV_STATE_TRACEFILES, LTTV_STATE_PROCESSES, @@ -410,6 +415,8 @@ init(LttvTracesetState *self, LttvTraceset *ts) tcs->usertraces = NULL; tcs->running_process = g_new(LttvProcessState*, ltt_trace_get_num_cpu(tc->t)); + tcs->cpu_states = g_new(LttvCPUState, + ltt_trace_get_num_cpu(tc->t)); restore_init_state(tcs); for(j = 0 ; j < nb_tracefile ; j++) { tfcs = @@ -417,6 +424,7 @@ init(LttvTracesetState *self, LttvTraceset *ts) LttvTracefileContext*, j)); tfcs->tracefile_name = ltt_tracefile_name(tfcs->parent.tf); tfcs->cpu = ltt_tracefile_cpu(tfcs->parent.tf); + tfcs->cpu_state = &(tcs->cpu_states[tfcs->cpu]); if(ltt_tracefile_tid(tfcs->parent.tf) != 0) { /* It's a Usertrace */ guint tid = ltt_tracefile_tid(tfcs->parent.tf); @@ -2124,11 +2132,11 @@ static gboolean schedchange(void *hook_data, void *call_data) LttEvent *e = ltt_tracefile_get_event(s->parent.tf); LttvTraceHookByFacility *thf = (LttvTraceHookByFacility *)hook_data; guint pid_in, pid_out; - gint state_out; + gint64 state_out; pid_out = ltt_event_get_unsigned(e, thf->f1); pid_in = ltt_event_get_unsigned(e, thf->f2); - state_out = ltt_event_get_int(e, thf->f3); + state_out = ltt_event_get_long_int(e, thf->f3); if(likely(process != NULL)) { @@ -2181,6 +2189,13 @@ static gboolean schedchange(void *hook_data, void *call_data) process->usertrace->cpu = cpu; // process->last_cpu_index = ltt_tracefile_num(((LttvTracefileContext*)s)->tf); process->state->change = s->parent.timestamp; + + /* update cpu status */ + if(pid_in == 0) + s->cpu_state->present_state = LTTV_CPU_IDLE; + else + s->cpu_state->present_state = LTTV_CPU_BUSY; + return FALSE; } @@ -2271,10 +2286,11 @@ static gboolean process_kernel_thread(void *hook_data, void *call_data) LttvExecutionState *es; /* PID */ - pid = ltt_event_get_unsigned(e, thf->f1); + pid = (guint)ltt_event_get_long_unsigned(e, thf->f1); s->parent.target_pid = pid; - process = lttv_state_find_process(ts, ANY_CPU, pid); + process = lttv_state_find_process_or_create(ts, ANY_CPU, pid, + <t_time_zero); process->execution_stack = g_array_set_size(process->execution_stack, 1); es = process->state = @@ -2379,7 +2395,7 @@ static gboolean process_exec(void *hook_data, void *call_data) process->name = g_quark_from_string(null_term_name); #endif //0 - process->name = ltt_event_get_string(e, thf->f1); + process->name = g_quark_from_string(ltt_event_get_string(e, thf->f1)); process->brand = LTTV_STATE_UNBRANDED; //g_free(null_term_name); return FALSE; @@ -3512,6 +3528,9 @@ static void module_init() LTT_FIELD_THIS_FN = g_quark_from_string("this_fn"); LTT_FIELD_CALL_SITE = g_quark_from_string("call_site"); + LTTV_CPU_UNKNOWN = g_quark_from_string("unknown"); + LTTV_CPU_IDLE = g_quark_from_string("idle"); + LTTV_CPU_BUSY = g_quark_from_string("busy"); } static void module_destroy()