X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Flttv%2Fstate.c;h=5b3fcf38a110ae9d22d8e24a324321ab7292c522;hb=74a588bbd1fab77ca50d8b956d7a5b3c33ac5bcd;hp=4e34eb424f3c09f4a006847a1d8a297351ddc6a8;hpb=ae80b6099838ee331fe1f90495d9353924b70441;p=lttv.git diff --git a/ltt/branches/poly/lttv/lttv/state.c b/ltt/branches/poly/lttv/lttv/state.c index 4e34eb42..5b3fcf38 100644 --- a/ltt/branches/poly/lttv/lttv/state.c +++ b/ltt/branches/poly/lttv/lttv/state.c @@ -204,7 +204,7 @@ init(LttvTracesetState *self, LttvTraceset *ts) nb_trace = lttv_traceset_number(ts); for(i = 0 ; i < nb_trace ; i++) { tc = self->parent.traces[i]; - tcs = (LttvTraceState *)tc; + tcs = LTTV_TRACE_STATE(tc); tcs->save_interval = LTTV_STATE_SAVE_INTERVAL; lttv_attribute_find(tcs->parent.t_a, LTTV_STATE_TRACE_STATE_USE_COUNT, LTTV_UINT, &v); @@ -372,7 +372,9 @@ static void copy_process_state(gpointer key, gpointer value,gpointer user_data) *new_process = *process; new_process->execution_stack = g_array_sized_new(FALSE, FALSE, sizeof(LttvExecutionState), PREALLOCATED_EXECUTION_STACK); - g_array_set_size(new_process->execution_stack,process->execution_stack->len); + new_process->execution_stack = + g_array_set_size(new_process->execution_stack, + process->execution_stack->len); for(i = 0 ; i < process->execution_stack->len; i++) { g_array_index(new_process->execution_stack, LttvExecutionState, i) = g_array_index(process->execution_stack, LttvExecutionState, i); @@ -648,7 +650,7 @@ create_name_tables(LttvTraceState *tcs) GQuark f_name, e_name; - LttvTraceHook *h; + LttvTraceHook h; LttvTraceHookByFacility *thf; @@ -681,15 +683,15 @@ create_name_tables(LttvTraceState *tcs) if(lttv_trace_find_hook(tcs->parent.t, LTT_FACILITY_KERNEL, LTT_EVENT_SYSCALL_ENTRY, LTT_FIELD_SYSCALL_ID, 0, 0, - NULL, h)) + NULL, &h)) return; - thf = lttv_trace_hook_get_first(h); + thf = lttv_trace_hook_get_first(&h); t = ltt_field_type(thf->f1); nb = ltt_type_element_number(t); - lttv_trace_hook_destroy(h); + lttv_trace_hook_destroy(&h); /* CHECK syscalls should be an enum but currently are not! name_tables->syscall_names = g_new(GQuark, nb); @@ -709,15 +711,15 @@ create_name_tables(LttvTraceState *tcs) if(lttv_trace_find_hook(tcs->parent.t, LTT_FACILITY_KERNEL, LTT_EVENT_TRAP_ENTRY, LTT_FIELD_TRAP_ID, 0, 0, - NULL, h)) + NULL, &h)) return; - thf = lttv_trace_hook_get_first(h); + thf = lttv_trace_hook_get_first(&h); t = ltt_field_type(thf->f1); nb = ltt_type_element_number(t); - lttv_trace_hook_destroy(h); + lttv_trace_hook_destroy(&h); /* name_tables->trap_names = g_new(GQuark, nb); @@ -736,15 +738,15 @@ create_name_tables(LttvTraceState *tcs) if(lttv_trace_find_hook(tcs->parent.t, LTT_FACILITY_KERNEL, LTT_EVENT_IRQ_ENTRY, LTT_FIELD_IRQ_ID, 0, 0, - NULL, h)) + NULL, &h)) return; - thf = lttv_trace_hook_get_first(h); + thf = lttv_trace_hook_get_first(&h); t = ltt_field_type(thf->f1); nb = ltt_type_element_number(t); - lttv_trace_hook_destroy(h); + lttv_trace_hook_destroy(&h); /* name_tables->irq_names = g_new(GQuark, nb); @@ -800,7 +802,6 @@ free_name_tables(LttvTraceState *tcs) g_free(name_tables); } - static void push_state(LttvTracefileState *tfs, LttvExecutionMode t, guint state_id) { @@ -810,7 +811,12 @@ static void push_state(LttvTracefileState *tfs, LttvExecutionMode t, guint depth = process->execution_stack->len; - g_array_set_size(process->execution_stack, depth + 1); + process->execution_stack = + g_array_set_size(process->execution_stack, depth + 1); + /* Keep in sync */ + process->state = + &g_array_index(process->execution_stack, LttvExecutionState, depth - 1); + es = &g_array_index(process->execution_stack, LttvExecutionState, depth); es->t = t; es->n = state_id; @@ -846,7 +852,8 @@ static void pop_state(LttvTracefileState *tfs, LttvExecutionMode t) return; } - g_array_set_size(process->execution_stack, depth - 1); + process->execution_stack = + g_array_set_size(process->execution_stack, depth - 1); process->state = &g_array_index(process->execution_stack, LttvExecutionState, depth - 2); process->state->change = tfs->parent.timestamp; @@ -900,7 +907,7 @@ lttv_state_create_process(LttvTracefileState *tfs, LttvProcessState *parent, process->last_cpu_index = ((LttvTracefileContext*)tfs)->index; process->execution_stack = g_array_sized_new(FALSE, FALSE, sizeof(LttvExecutionState), PREALLOCATED_EXECUTION_STACK); - g_array_set_size(process->execution_stack, 1); + process->execution_stack = g_array_set_size(process->execution_stack, 1); es = process->state = &g_array_index(process->execution_stack, LttvExecutionState, 0); es->t = LTTV_STATE_USER_MODE; @@ -1072,9 +1079,11 @@ static gboolean schedchange(void *hook_data, void *call_data) is missing. It is not obvious how we could, after the fact, compensate the wrongly attributed statistics. */ - if(unlikely(s->process->pid != pid_out)) { - g_assert(s->process->pid == 0); - } + //This test only makes sense once the state is known and if there is no + //missing events. + //if(unlikely(s->process->pid != pid_out)) { + // g_assert(s->process->pid == 0); + //} if(unlikely(s->process->state->s == LTTV_STATE_EXIT)) { s->process->state->s = LTTV_STATE_ZOMBIE; @@ -1212,7 +1221,7 @@ void lttv_state_add_event_hooks(LttvTracesetState *self) associated by id hooks. */ hooks = g_array_sized_new(FALSE, FALSE, sizeof(LttvTraceHook), 10); - g_array_set_size(hooks, 10); + hooks = g_array_set_size(hooks, 10); ret = lttv_trace_find_hook(ts->parent.t, LTT_FACILITY_KERNEL, LTT_EVENT_SYSCALL_ENTRY, @@ -1330,7 +1339,7 @@ void lttv_state_remove_event_hooks(LttvTracesetState *self) nb_trace = lttv_traceset_number(traceset); for(i = 0 ; i < nb_trace ; i++) { - ts = (LttvTraceState*)self->parent.traces[i]; + ts = LTTV_TRACE_STATE(self->parent.traces[i]); lttv_attribute_find(self->parent.a, LTTV_STATE_HOOKS, LTTV_POINTER, &val); hooks = *(val.v_pointer);