X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Flttv%2Fstats.c;h=7944bcd68e2bd326d4131e8c9c4723adea6ba881;hb=0292757b8dbc9107de3cdf01eb6dd1d8fe726663;hp=6370720aa81867361181afacf37bbc338015f5e9;hpb=a5845ab3269869d508937a3b3c8c752c48832d42;p=lttv.git diff --git a/ltt/branches/poly/lttv/lttv/stats.c b/ltt/branches/poly/lttv/lttv/stats.c index 6370720a..7944bcd6 100644 --- a/ltt/branches/poly/lttv/lttv/stats.c +++ b/ltt/branches/poly/lttv/lttv/stats.c @@ -724,6 +724,20 @@ gboolean process_exit(void *hook_data, void *call_data) return FALSE; } +gboolean before_enum_process_state(void *hook_data, void *call_data) +{ + mode_end((LttvTracefileStats *)call_data); + after_mode_end((LttvTracefileStats *)call_data); + mode_change((LttvTracefileStats *)call_data); + return FALSE; +} + +gboolean after_enum_process_state(void *hook_data, void *call_data) +{ + update_event_tree((LttvTracefileStats *)call_data); + return FALSE; +} + gboolean process_free(void *hook_data, void *call_data) { return FALSE; @@ -761,6 +775,12 @@ static void lttv_stats_cleanup_process_state(gpointer key, gpointer value, &g_array_index(ts->parent.tracefiles, LttvTracefileContext*, process->cpu); int cleanup_empty = 0; + LttTime nested_delta = ltt_time_zero; + /* FIXME : ok, this is a hack. The time is infinite here :( */ + LttTime save_time = (*tfs)->parent.parent.timestamp; + LttTime start, end; + ltt_trace_time_span_get(ts->parent.t, &start, &end); + (*tfs)->parent.parent.timestamp = end; do { if(ltt_time_compare(process->state->cum_cpu_time, ltt_time_zero) != 0) { @@ -769,17 +789,17 @@ static void lttv_stats_cleanup_process_state(gpointer key, gpointer value, process->current_function, process->state->t, process->state->n, &((*tfs)->current_events_tree), &((*tfs)->current_event_types_tree)); - /* FIXME : ok, this is a hack. The time is infinite here :( */ - LttTime save_time = (*tfs)->parent.parent.timestamp; - LttTime start, end; - ltt_trace_time_span_get(ts->parent.t, &start, &end); - (*tfs)->parent.parent.timestamp = end; mode_end(*tfs); - (*tfs)->parent.parent.timestamp = save_time; + nested_delta = process->state->cum_cpu_time; } cleanup_empty = lttv_state_pop_state_cleanup(process, (LttvTracefileState *)*tfs); + process->state->cum_cpu_time = ltt_time_add(process->state->cum_cpu_time, + nested_delta); + } while(cleanup_empty != 1); + + (*tfs)->parent.parent.timestamp = save_time; } /* For each process in the state, for each of their stacked states, @@ -788,11 +808,9 @@ static void lttv_stats_cleanup_state(LttvTraceStats *tcs) { LttvTraceState *ts = (LttvTraceState *)tcs; -#if 0 /* Does not work correctly FIXME. */ g_hash_table_foreach(ts->processes, lttv_stats_cleanup_process_state, tcs); -#endif //0 } void @@ -996,9 +1014,9 @@ void lttv_stats_add_event_hooks(LttvTracesetStats *self) /* Find the eventtype id for the following events and register the associated by id hooks. */ - hooks = g_array_sized_new(FALSE, FALSE, sizeof(LttvTraceHook), 11); - g_array_set_size(hooks, 11); - hn=0; + hooks = g_array_sized_new(FALSE, FALSE, sizeof(LttvTraceHook), 12); + g_array_set_size(hooks, 12); + hn=0; ret = lttv_trace_find_hook(ts->parent.parent.t, LTT_FACILITY_KERNEL_ARCH, LTT_EVENT_SYSCALL_ENTRY, @@ -1076,14 +1094,22 @@ void lttv_stats_add_event_hooks(LttvTracesetStats *self) before_function_exit, NULL, &g_array_index(hooks, LttvTraceHook, hn++)); if(ret) hn--; - + + /* statedump-related hooks */ + ret = lttv_trace_find_hook(ts->parent.parent.t, + LTT_FACILITY_STATEDUMP, LTT_EVENT_ENUM_PROCESS_STATE, + LTT_FIELD_PID, LTT_FIELD_PARENT_PID, LTT_FIELD_NAME, + before_enum_process_state, NULL, + &g_array_index(hooks, LttvTraceHook, hn++)); + if(ret) hn--; + g_array_set_size(hooks, hn); before_hooks = hooks; - hooks = g_array_sized_new(FALSE, FALSE, sizeof(LttvTraceHook), 14); - g_array_set_size(hooks, 14); - hn=0; + hooks = g_array_sized_new(FALSE, FALSE, sizeof(LttvTraceHook), 15); + g_array_set_size(hooks, 15); + hn=0; ret = lttv_trace_find_hook(ts->parent.parent.t, LTT_FACILITY_KERNEL_ARCH, LTT_EVENT_SYSCALL_ENTRY, @@ -1182,7 +1208,15 @@ void lttv_stats_add_event_hooks(LttvTracesetStats *self) after_function_exit, NULL, &g_array_index(hooks, LttvTraceHook, hn++)); if(ret) hn--; - + + /* statedump-related hooks */ + ret = lttv_trace_find_hook(ts->parent.parent.t, + LTT_FACILITY_STATEDUMP, LTT_EVENT_ENUM_PROCESS_STATE, + LTT_FIELD_PID, LTT_FIELD_PARENT_PID, LTT_FIELD_NAME, + after_enum_process_state, NULL, + &g_array_index(hooks, LttvTraceHook, hn++)); + if(ret) hn--; + g_array_set_size(hooks, hn); after_hooks = hooks;