X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Flttv%2Fstate.c;h=67a6686c97064402d62717d7f4edad98f5d7da14;hb=1986f25412e16e9cadaa2027c735c3d12311f129;hp=274d5f4808cb3db7d58b90521ff08bcc44616e10;hpb=27304273a482c99620e992daf3826eb61208fd4b;p=lttv.git diff --git a/ltt/branches/poly/lttv/lttv/state.c b/ltt/branches/poly/lttv/lttv/state.c index 274d5f48..67a6686c 100644 --- a/ltt/branches/poly/lttv/lttv/state.c +++ b/ltt/branches/poly/lttv/lttv/state.c @@ -436,9 +436,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 +512,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; + } } } @@ -968,9 +974,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 +999,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; @@ -1022,9 +1024,12 @@ static gboolean irq_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)); + guint8 fac_id = ltt_event_facility_id(e); + guint8 ev_id = ltt_event_eventtype_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)); LttField *f = thf->f1; LttvExecutionSubmode submode; @@ -1051,14 +1056,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)) { @@ -1099,9 +1103,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; @@ -1136,9 +1138,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; @@ -1157,9 +1157,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; @@ -1204,6 +1202,8 @@ void lttv_state_add_event_hooks(LttvTracesetState *self) LttvAttributeValue val; + gint ret; + nb_trace = lttv_traceset_number(traceset); for(i = 0 ; i < nb_trace ; i++) { ts = (LttvTraceState *)self->parent.traces[i]; @@ -1214,55 +1214,65 @@ void lttv_state_add_event_hooks(LttvTracesetState *self) hooks = g_array_sized_new(FALSE, FALSE, sizeof(LttvTraceHook), 10); g_array_set_size(hooks, 10); - lttv_trace_find_hook(ts->parent.t, + ret = lttv_trace_find_hook(ts->parent.t, LTT_FACILITY_KERNEL, LTT_EVENT_SYSCALL_ENTRY, LTT_FIELD_SYSCALL_ID, 0, 0, syscall_entry, &g_array_index(hooks, LttvTraceHook, 0)); + g_assert(!ret); - lttv_trace_find_hook(ts->parent.t, + ret = lttv_trace_find_hook(ts->parent.t, LTT_FACILITY_KERNEL, LTT_EVENT_SYSCALL_EXIT, 0, 0, 0, syscall_exit, &g_array_index(hooks, LttvTraceHook, 1)); + g_assert(!ret); - lttv_trace_find_hook(ts->parent.t, + ret = lttv_trace_find_hook(ts->parent.t, LTT_FACILITY_KERNEL, LTT_EVENT_TRAP_ENTRY, LTT_FIELD_TRAP_ID, 0, 0, trap_entry, &g_array_index(hooks, LttvTraceHook, 2)); + g_assert(!ret); - lttv_trace_find_hook(ts->parent.t, + ret = lttv_trace_find_hook(ts->parent.t, LTT_FACILITY_KERNEL, LTT_EVENT_TRAP_EXIT, 0, 0, 0, trap_exit, &g_array_index(hooks, LttvTraceHook, 3)); + g_assert(!ret); - lttv_trace_find_hook(ts->parent.t, + ret = lttv_trace_find_hook(ts->parent.t, LTT_FACILITY_KERNEL, LTT_EVENT_IRQ_ENTRY, LTT_FIELD_IRQ_ID, 0, 0, irq_entry, &g_array_index(hooks, LttvTraceHook, 4)); + g_assert(!ret); - lttv_trace_find_hook(ts->parent.t, + ret = lttv_trace_find_hook(ts->parent.t, LTT_FACILITY_KERNEL, LTT_EVENT_IRQ_EXIT, 0, 0, 0, irq_exit, &g_array_index(hooks, LttvTraceHook, 5)); + g_assert(!ret); - lttv_trace_find_hook(ts->parent.t, + ret = lttv_trace_find_hook(ts->parent.t, LTT_FACILITY_PROCESS, LTT_EVENT_SCHEDCHANGE, LTT_FIELD_OUT, LTT_FIELD_IN, LTT_FIELD_OUT_STATE, schedchange, &g_array_index(hooks, LttvTraceHook, 6)); + g_assert(!ret); - lttv_trace_find_hook(ts->parent.t, + ret = lttv_trace_find_hook(ts->parent.t, LTT_FACILITY_PROCESS, LTT_EVENT_FORK, LTT_FIELD_PARENT_PID, LTT_FIELD_CHILD_PID, 0, process_fork, &g_array_index(hooks, LttvTraceHook, 7)); + g_assert(!ret); - lttv_trace_find_hook(ts->parent.t, + ret = lttv_trace_find_hook(ts->parent.t, LTT_FACILITY_PROCESS, LTT_EVENT_EXIT, LTT_FIELD_PID, 0, 0, process_exit, &g_array_index(hooks, LttvTraceHook, 8)); + g_assert(!ret); - lttv_trace_find_hook(ts->parent.t, + ret = lttv_trace_find_hook(ts->parent.t, LTT_FACILITY_PROCESS, LTT_EVENT_FREE, LTT_FIELD_PID, 0, 0, process_free, &g_array_index(hooks, LttvTraceHook, 9)); + g_assert(!ret); /* Add these hooks to each event_by_id hooks list */ @@ -1271,8 +1281,8 @@ void lttv_state_add_event_hooks(LttvTracesetState *self) for(j = 0 ; j < nb_tracefile ; j++) { tfs = - LTTV_TRACEFILE_STATE(&g_array_index(ts->parent.tracefiles, - LttvTracefileContext, j)); + LTTV_TRACEFILE_STATE(g_array_index(ts->parent.tracefiles, + LttvTracefileContext*, j)); for(k = 0 ; k < hooks->len ; k++) { hook = &g_array_index(hooks, LttvTraceHook, k); @@ -1281,7 +1291,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, - &g_array_index(hooks, LttvTraceHook, k), + thf, LTTV_PRIO_STATE); } } @@ -1341,11 +1351,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); } }