X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Flttv%2Fstate.c;h=05852dfb784d2c70bf44f34390ec6c9b5e610ba7;hb=2cdc690b245223a2805188d0584564bdfcbc9282;hp=aa235f2d27ee350580ec30ac8613198b9d900b72;hpb=2d262115fc06b5ffb6038207a6d0c1d5f81763c2;p=lttv.git diff --git a/ltt/branches/poly/lttv/lttv/state.c b/ltt/branches/poly/lttv/lttv/state.c index aa235f2d..05852dfb 100644 --- a/ltt/branches/poly/lttv/lttv/state.c +++ b/ltt/branches/poly/lttv/lttv/state.c @@ -448,7 +448,8 @@ static void state_restore(LttvTraceState *self, LttvAttribute *container) if(*(value.v_pointer) == NULL) tfcs->parent.e = NULL; else { ep = *(value.v_pointer); - lttv_process_tracefile_seek_position(tfcs->parent, ep); + g_assert(tfcs->parent.t_context != NULL); + lttv_process_tracefile_seek_position(LTTV_TRACEFILE_CONTEXT(tfcs), ep); } } } @@ -472,6 +473,7 @@ static void state_saved_free(LttvTraceState *self, LttvAttribute *container) tracefiles_tree = lttv_attribute_find_subdir(container, LTTV_STATE_TRACEFILES); + g_object_ref(G_OBJECT(tracefiles_tree)); lttv_attribute_remove_by_name(container, LTTV_STATE_TRACEFILES); type = lttv_attribute_get_by_name(container, LTTV_STATE_PROCESSES, @@ -495,7 +497,7 @@ static void state_saved_free(LttvTraceState *self, LttvAttribute *container) g_assert(type == LTTV_POINTER); if(*(value.v_pointer) != NULL) g_free(*(value.v_pointer)); } - lttv_attribute_recursive_free(tracefiles_tree); + g_object_unref(G_OBJECT(tracefiles_tree)); } @@ -522,7 +524,6 @@ static void free_saved_state(LttvTraceState *self) } lttv_attribute_remove_by_name(self->parent.t_a, LTTV_STATE_SAVED_STATES); - lttv_attribute_recursive_free(saved_states); } @@ -985,8 +986,19 @@ static gboolean schedchange(void *hook_data, void *call_data) } -static gboolean process_fork(void *hook_data, void *call_data) +static gboolean process_fork(LttvTraceHook *trace_hook, LttvTracefileState *s) { + LttField *f; + guint child_pid; + + /* Child PID */ + f = trace_hook->f3; + child_pid = ltt_event_get_unsigned(s->parent.e, f); + + lttv_state_create_process(s, s->process, child_pid); + + return FALSE; +#if 0 LttField *f = ((LttvTraceHook *)hook_data)->f1; LttvTracefileState *s = (LttvTracefileState *)call_data; @@ -996,17 +1008,43 @@ static gboolean process_fork(void *hook_data, void *call_data) child_pid = ltt_event_get_unsigned(s->parent.e, f); lttv_state_create_process(s, s->process, child_pid); return FALSE; +#endif //0 } -static gboolean process_exit(void *hook_data, void *call_data) +static gboolean process_exit(LttvTraceHook *trace_hook, LttvTracefileState *s) { + if(s->process != NULL) { + s->process->state->s = LTTV_STATE_EXIT; + } + return FALSE; + +#if 0 LttvTracefileState *s = (LttvTracefileState *)call_data; if(s->process != NULL) { s->process->state->s = LTTV_STATE_EXIT; } return FALSE; +#endif //0 +} + +gboolean process(void *hook_data, void *call_data) +{ + LttvTraceHook *trace_hook = (LttvTraceHook *)hook_data; + LttField *f = trace_hook->f1; + + LttvTracefileState *s = (LttvTracefileState *)call_data; + + guint sub_id = ltt_event_get_unsigned(s->parent.e, f); + + /* CHECK : do not hardcode the sub_id values here ? */ + if(sub_id == 2) { + return process_fork(trace_hook, s); + } else if(sub_id == 3) { + return process_exit(trace_hook, s); + } + return 0; } @@ -1057,12 +1095,17 @@ void lttv_state_add_event_hooks(LttvTracesetState *self) lttv_trace_find_hook(ts->parent.t, "core", "schedchange", "in", "out", "out_state", schedchange, &g_array_index(hooks, LttvTraceHook, 6)); + lttv_trace_find_hook(ts->parent.t, "core", "process", "event_sub_id", + "event_data1", "event_data2", process, + &g_array_index(hooks, LttvTraceHook, 7)); + +#if 0 lttv_trace_find_hook(ts->parent.t, "core", "process_fork", "child_pid", NULL, NULL, process_fork, &g_array_index(hooks, LttvTraceHook, 7)); lttv_trace_find_hook(ts->parent.t, "core", "process_exit", NULL, NULL, NULL, process_exit, &g_array_index(hooks, LttvTraceHook, 8)); - +#endif //0 /* Add these hooks to each event_by_id hooks list */ nb_tracefile = ltt_trace_control_tracefile_number(ts->parent.t) + @@ -1233,6 +1276,15 @@ void lttv_state_save_add_event_hooks(LttvTracesetState *self) } } +gint lttv_state_save_hook_add_event_hooks(void *hook_data, void *call_data) +{ + LttvTracesetState *tss = (LttvTracesetState*)(call_data); + + lttv_state_save_add_event_hooks(tss); + + return 0; +} + void lttv_state_save_remove_event_hooks(LttvTracesetState *self) { @@ -1268,6 +1320,14 @@ void lttv_state_save_remove_event_hooks(LttvTracesetState *self) } } +gint lttv_state_save_hook_remove_event_hooks(void *hook_data, void *call_data) +{ + LttvTracesetState *tss = (LttvTracesetState*)(call_data); + + lttv_state_save_remove_event_hooks(tss); + + return 0; +} void lttv_state_traceset_seek_time_closest(LttvTracesetState *self, LttTime t) {