X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Flttv%2Fstate.c;h=5b3fcf38a110ae9d22d8e24a324321ab7292c522;hb=327a43149d62f1984112e1ef022ef039897f78ad;hp=95d6a5a50df8b2397bcc5179fb2fbce22486d866;hpb=9d239bd92ef3198e80333c703f3ab8ff8cdaeaf7;p=lttv.git diff --git a/ltt/branches/poly/lttv/lttv/state.c b/ltt/branches/poly/lttv/lttv/state.c index 95d6a5a5..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); @@ -436,9 +438,11 @@ static void state_save(LttvTraceState *self, LttvAttribute *container) *(value.v_uint) = tfcs->process->pid; value = lttv_attribute_add(tracefile_tree, LTTV_STATE_EVENT, LTTV_POINTER); - LttEvent *e = ltt_tracefile_get_event(tfcs->parent.tf); - if(e == NULL) *(value.v_pointer) = NULL; - else { + /* Only save the position of the tfs is in the pqueue */ + if(!g_tree_lookup(self->parent.ts_context->pqueue, &tfcs->parent)) { + *(value.v_pointer) = NULL; + } else { + LttEvent *e = ltt_tracefile_get_event(tfcs->parent.tf); ep = ltt_event_position_new(); ltt_event_position(e, ep); *(value.v_pointer) = ep; @@ -510,9 +514,13 @@ static void state_restore(LttvTraceState *self, LttvAttribute *container) LttvTracefileContext *tfc = LTTV_TRACEFILE_CONTEXT(tfcs); - g_assert(ltt_tracefile_seek_position(tfc->tf, ep) == 0); - tfc->timestamp = ltt_event_time(ltt_tracefile_get_event(tfc->tf)); - g_tree_insert(tsc->pqueue, tfc, tfc); + if(ep != NULL) { + g_assert(ltt_tracefile_seek_position(tfc->tf, ep) == 0); + tfc->timestamp = ltt_event_time(ltt_tracefile_get_event(tfc->tf)); + g_tree_insert(tsc->pqueue, tfc, tfc); + } else { + tfc->timestamp = ltt_time_infinite; + } } } @@ -642,7 +650,7 @@ create_name_tables(LttvTraceState *tcs) GQuark f_name, e_name; - LttvTraceHook *h; + LttvTraceHook h; LttvTraceHookByFacility *thf; @@ -675,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); @@ -703,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); @@ -730,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); @@ -794,7 +802,6 @@ free_name_tables(LttvTraceState *tcs) g_free(name_tables); } - static void push_state(LttvTracefileState *tfs, LttvExecutionMode t, guint state_id) { @@ -804,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; @@ -840,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; @@ -894,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; @@ -968,9 +981,7 @@ static gboolean syscall_entry(void *hook_data, void *call_data) { LttvTracefileState *s = (LttvTracefileState *)call_data; LttEvent *e = ltt_tracefile_get_event(s->parent.tf); - LttvTraceHookByFacility *thf = - lttv_trace_hook_get_fac((LttvTraceHook *)hook_data, - ltt_event_facility_id(e)); + LttvTraceHookByFacility *thf = (LttvTraceHookByFacility *)hook_data; LttField *f = thf->f1; LttvExecutionSubmode submode; @@ -995,9 +1006,7 @@ static gboolean trap_entry(void *hook_data, void *call_data) { LttvTracefileState *s = (LttvTracefileState *)call_data; LttEvent *e = ltt_tracefile_get_event(s->parent.tf); - LttvTraceHookByFacility *thf = - lttv_trace_hook_get_fac((LttvTraceHook *)hook_data, - ltt_event_facility_id(e)); + LttvTraceHookByFacility *thf = (LttvTraceHookByFacility *)hook_data; LttField *f = thf->f1; LttvExecutionSubmode submode; @@ -1024,9 +1033,7 @@ static gboolean irq_entry(void *hook_data, void *call_data) LttEvent *e = ltt_tracefile_get_event(s->parent.tf); guint8 fac_id = ltt_event_facility_id(e); guint8 ev_id = ltt_event_eventtype_id(e); - LttvTraceHookByFacility *thf = - lttv_trace_hook_get_fac((LttvTraceHook *)hook_data, - ltt_event_facility_id(e)); + LttvTraceHookByFacility *thf = (LttvTraceHookByFacility *)hook_data; // g_assert(lttv_trace_hook_get_first((LttvTraceHook *)hook_data)->f1 != NULL); g_assert(thf->f1 != NULL); // g_assert(thf == lttv_trace_hook_get_first((LttvTraceHook *)hook_data)); @@ -1056,14 +1063,13 @@ static gboolean schedchange(void *hook_data, void *call_data) { LttvTracefileState *s = (LttvTracefileState *)call_data; LttEvent *e = ltt_tracefile_get_event(s->parent.tf); - LttvTraceHookByFacility *thf = - lttv_trace_hook_get_fac((LttvTraceHook *)hook_data, - ltt_event_facility_id(e)); - guint pid_in, pid_out, state_out; + LttvTraceHookByFacility *thf = (LttvTraceHookByFacility *)hook_data; + guint pid_in, pid_out; + gint 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_unsigned(e, thf->f3); + state_out = ltt_event_get_int(e, thf->f3); if(likely(s->process != NULL)) { @@ -1073,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; @@ -1104,9 +1112,7 @@ static gboolean process_fork(void *hook_data, void *call_data) { LttvTracefileState *s = (LttvTracefileState *)call_data; LttEvent *e = ltt_tracefile_get_event(s->parent.tf); - LttvTraceHookByFacility *thf = - lttv_trace_hook_get_fac((LttvTraceHook *)hook_data, - ltt_event_facility_id(e)); + LttvTraceHookByFacility *thf = (LttvTraceHookByFacility *)hook_data; LttField *f; guint parent_pid; guint child_pid; @@ -1141,9 +1147,7 @@ static gboolean process_exit(void *hook_data, void *call_data) { LttvTracefileState *s = (LttvTracefileState *)call_data; LttEvent *e = ltt_tracefile_get_event(s->parent.tf); - LttvTraceHookByFacility *thf = - lttv_trace_hook_get_fac((LttvTraceHook *)hook_data, - ltt_event_facility_id(e)); + LttvTraceHookByFacility *thf = (LttvTraceHookByFacility *)hook_data; LttField *f; guint pid; @@ -1162,9 +1166,7 @@ static gboolean process_free(void *hook_data, void *call_data) { LttvTracefileState *s = (LttvTracefileState *)call_data; LttEvent *e = ltt_tracefile_get_event(s->parent.tf); - LttvTraceHookByFacility *thf = - lttv_trace_hook_get_fac((LttvTraceHook *)hook_data, - ltt_event_facility_id(e)); + LttvTraceHookByFacility *thf = (LttvTraceHookByFacility *)hook_data; guint release_pid; LttvProcessState *process; @@ -1219,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, @@ -1298,7 +1300,7 @@ void lttv_state_add_event_hooks(LttvTracesetState *self) lttv_hooks_add( lttv_hooks_by_id_find(tfs->parent.event_by_id, thf->id), thf->h, - hook, + thf, LTTV_PRIO_STATE); } } @@ -1358,11 +1360,12 @@ void lttv_state_remove_event_hooks(LttvTracesetState *self) lttv_hooks_remove_data( lttv_hooks_by_id_find(tfs->parent.event_by_id, thf->id), thf->h, - &g_array_index(hooks, LttvTraceHook, k)); + thf); } - lttv_trace_hook_destroy(&g_array_index(hooks, LttvTraceHook, k)); } } + for(k = 0 ; k < hooks->len ; k++) + lttv_trace_hook_destroy(&g_array_index(hooks, LttvTraceHook, k)); g_array_free(hooks, TRUE); } }