X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=lttv%2Fmodules%2Ftext%2Fdepanalysis.c;h=5a4064aefa9b5c949b001e90831777307e135f91;hb=8d30813496c3de5beb08128d255164cd1dacfc0a;hp=ca926174b1d3987b4138a4f85a7444ea8a829a93;hpb=8c108c1c55e65e15d59378e2cdc2231f35a84c4c;p=lttv.git diff --git a/lttv/modules/text/depanalysis.c b/lttv/modules/text/depanalysis.c index ca926174..5a4064ae 100644 --- a/lttv/modules/text/depanalysis.c +++ b/lttv/modules/text/depanalysis.c @@ -49,6 +49,7 @@ static int depanalysis_range_pid = -1; static int depanalysis_range_pid_searching = -1; static int depanalysis_use_time=0; static int depanalysis_event_limit = -1; +static int a_print_simple_summary = 0; static LttTime depanalysis_time1, depanalysis_time2; static char *arg_t1_str,*arg_t2_str; static int statedump_finished = 0; @@ -297,6 +298,14 @@ static void delete_data_val(struct process_with_state *pwstate) // g_free(pwstate); } +inline void print_time(LttTime t) +{ + //printf("%lu.%lu", t.tv_sec, t.tv_nsec); + double f; + f = (double)t.tv_sec + ((double)t.tv_nsec)/1000000000.0; + printf("%.9f", f); +} + static struct sstack_item *prepare_push_item(struct process *p, enum llev_state st, LttTime t) { struct process_with_state *pwstate = g_malloc(sizeof(struct process_with_state)); @@ -322,7 +331,9 @@ static struct sstack_item *prepare_push_item(struct process *p, enum llev_state pwstate->state.private = g_malloc(llev_state_infos[st].size_priv); item->data_val = pwstate; - item->delete_data_val = delete_data_val; + item->delete_data_val = (void (*)(void*))delete_data_val; + + return item; } static void *item_private(struct sstack_item *item) @@ -444,7 +455,7 @@ static int try_pop_blocked_llev_preempted(struct process *p, LttTime t) pwstate = g_array_index(p->stack->array, struct sstack_item *, push_idx)->data_val; if(!(pwstate->state.bstate == LLEV_PREEMPTED && ((struct llev_state_info_preempted *)pwstate->state.private)->prev_state > 0)) { - printf("double try wake up\n"); + //printf("double try wake up\n"); return 0; } } @@ -498,26 +509,18 @@ static gboolean write_traceset_header(void *hook_data, void *call_data) g_info("Traceset header"); /* Print the trace set header */ - fprintf(a_file,"Trace set contains %d traces\n\n", + g_info(a_file,"Trace set contains %d traces\n\n", lttv_traceset_number(tc->ts)); return FALSE; } -inline void print_time(LttTime t) -{ - //printf("%lu.%lu", t.tv_sec, t.tv_nsec); - double f; - f = (double)t.tv_sec + ((double)t.tv_nsec)/1000000000.0; - printf("%.9f", f); -} - -GArray *oldstyle_stack_to_garray(struct process_state_stack **oldstyle_stack, int current) +GArray *oldstyle_stack_to_garray(struct process_state **oldstyle_stack, int current) { GArray *retval; int i; - retval = g_array_new(FALSE, FALSE, sizeof(struct process_state_stack *)); + retval = g_array_new(FALSE, FALSE, sizeof(struct process_state *)); for(i=0; ihlev_history, struct process_state *, result); } +static void print_indent(int offset) +{ + if (offset > 2) { + int i; + + printf("%*s", 8, ""); + for (i = 3; i < offset; i++) { + printf("|"); + printf("%*s", 4, ""); + } + } else + printf("%*s", 4*offset, ""); +} + static void print_delay_pid(int pid, LttTime t1, LttTime t2, int offset) { struct process *p; @@ -924,8 +941,8 @@ static void print_delay_pid(int pid, LttTime t1, LttTime t2, int offset) state_private_blocked = pstate->private; struct process_state *state_unblocked; - printf("%*s", 8*offset, ""); - printf("Blocked in "); + print_indent(offset); + printf("--> Blocked in "); print_stack_garray_horizontal(state_private_blocked->llev_state_entry); printf("(times: "); @@ -940,15 +957,15 @@ static void print_delay_pid(int pid, LttTime t1, LttTime t2, int offset) if(state_unblocked->bstate == HLEV_INTERRUPTED_IRQ) { struct hlev_state_info_interrupted_irq *priv = state_unblocked->private; /* if in irq or softirq, we don't care what the waking process was doing because they are asynchroneous events */ - printf("%*s", 8*offset, ""); - printf("Woken up by an IRQ: "); + print_indent(offset); + printf("--- Woken up by an IRQ: "); print_irq(priv->irq); printf("\n"); } else if(state_unblocked->bstate == HLEV_INTERRUPTED_SOFTIRQ) { struct hlev_state_info_interrupted_softirq *priv = state_unblocked->private; - printf("%*s", 8*offset, ""); - printf("Woken up by a SoftIRQ: "); + print_indent(offset); + printf("--- Woken up by a SoftIRQ: "); print_softirq(priv->softirq); printf("\n"); } @@ -962,8 +979,8 @@ static void print_delay_pid(int pid, LttTime t1, LttTime t2, int offset) t2prime = pstate->time_end; print_delay_pid(state_private_blocked->pid_exit, t1prime, t2prime, offset+1); - printf("%*s", 8*offset, ""); - printf("Woken up in context of "); + print_indent(offset); + printf("--- Woken up in context of "); print_pid(state_private_blocked->pid_exit); if(state_private_blocked->llev_state_exit) { print_stack_garray_horizontal(state_private_blocked->llev_state_exit); @@ -975,7 +992,7 @@ static void print_delay_pid(int pid, LttTime t1, LttTime t2, int offset) } } else { - printf("%*s", 8*offset, ""); + print_indent(offset); printf("Weird... cannot find in what state the waker (%d) was\n", state_private_blocked->pid_exit); } @@ -1000,6 +1017,17 @@ static void print_range_critical_path(int process, LttTime t1, LttTime t2) print_delay_pid(process, t1, t2, 2); } +/* + * output legend example: + * + * --> Blocked in RUNNING, SYSCALL NNN [syscall_name] + * | ---> Blocked in RUNNING, SYSCALL NNN [syscall_name] + * | | --> Blocked in RUNNING, SYSCALL [syscall_name] + * | | --- Woken up by an IRQ: IRQ 0 [timer] + * | --- Woken up in context of PID [appname] in high-level state RUNNING + * --- Woken up in context of PID [appname] in high-level state RUNNING + */ + static void print_process_critical_path_summary() { struct process *pinfo; @@ -1020,6 +1048,8 @@ static void print_process_critical_path_summary() struct process_state *hlev_state_cur; pinfo = (struct process *)pinfos->data; + if (depanalysis_range_pid_searching != -1 && pinfo->pid != depanalysis_range_pid_searching) + goto next_iter; printf("\tProcess %d [%s]\n", pinfo->pid, g_quark_to_string(pinfo->name)); if(pinfo->hlev_history->len < 1) @@ -1046,7 +1076,7 @@ gint compare_states_length(gconstpointer a, gconstpointer b) return val; } -static void print_simple_summary() +static void print_simple_summary(void) { struct process *pinfo; GList *pinfos; @@ -1054,6 +1084,9 @@ static void print_simple_summary() int i,j; int id_for_episodes = 0; + if (!a_print_simple_summary) + return; + /* we save all the nodes here to print the episodes table quickly */ GArray *all_nodes = g_array_new(FALSE, FALSE, sizeof(struct summary_tree_node *)); @@ -1354,7 +1387,7 @@ static gboolean write_traceset_footer(void *hook_data, void *call_data) g_info("TextDump traceset footer"); - fprintf(a_file,"End trace set\n\n"); + g_info(a_file,"End trace set\n\n"); // if(LTTV_IS_TRACESET_STATS(tc)) { // lttv_stats_sum_traceset((LttvTracesetStats *)tc, ltt_time_infinite); @@ -1370,8 +1403,8 @@ static gboolean write_traceset_footer(void *hook_data, void *call_data) /* print the reports */ print_simple_summary(); print_process_critical_path_summary(); - printf("depanalysis_use_time = %d\n", depanalysis_use_time); if(depanalysis_use_time == 3) { + printf("depanalysis_use_time = %d\n", depanalysis_use_time); if(depanalysis_range_pid == -1 && depanalysis_range_pid_searching >= 0) depanalysis_range_pid = depanalysis_range_pid_searching; @@ -1885,7 +1918,7 @@ static int process_event(void *hook_data, void *call_data) goto next_iter; item->data_val = se; - item->delete_data_val = delete_data_val; + item->delete_data_val = (void (*)(void *))delete_data_val; sstack_add_item(target_pinfo->stack, item); @@ -1963,6 +1996,10 @@ static void arg_limit(void *hook_data) { } +static void arg_sum(void *hook_data) +{ +} + static void init() { gboolean result; @@ -1983,6 +2020,8 @@ static void init() LTTV_OPT_INT, &depanalysis_range_pid_searching, arg_pid, NULL); lttv_option_add("limit-events", 0, "dependency limit event count", "count", LTTV_OPT_INT, &depanalysis_event_limit, arg_limit, NULL); + lttv_option_add("print-summary", 0, "print simple summary", "sum", + LTTV_OPT_INT, &a_print_simple_summary, arg_sum, NULL); process_hash_table = g_hash_table_new(g_int_hash, g_int_equal); syscall_table = g_hash_table_new(g_int_hash, g_int_equal); @@ -2028,6 +2067,7 @@ static void destroy() lttv_option_remove("dep-time-end"); lttv_option_remove("dep-pid"); lttv_option_remove("limit-events"); + lttv_option_remove("print-summary"); g_hash_table_destroy(process_hash_table); g_hash_table_destroy(syscall_table);