GPtrArray *quarktable);
/* Resource function prototypes */
-static LttvBdevState *get_hashed_bdevstate(LttvTraceState *ts, guint16 devcode);
+static LttvBdevState *get_hashed_bdevstate(LttvTraceState *ts, guint32 devcode);
static LttvBdevState *bdevstate_new(void);
static void bdevstate_free(LttvBdevState *);
static void bdevstate_free_cb(gpointer key, gpointer value, gpointer user_data);
/* bdevstate stuff */
-static LttvBdevState *get_hashed_bdevstate(LttvTraceState *ts, guint16 devcode)
+static LttvBdevState *get_hashed_bdevstate(LttvTraceState *ts, guint32 devcode)
{
gint devcode_gint = devcode;
gpointer bdev = g_hash_table_lookup(ts->bdev_states, &devcode_gint);
lttv_trace_get_hook_field(th, 1));
guint oper = ltt_event_get_long_unsigned(e,
lttv_trace_get_hook_field(th, 2));
- guint16 devcode = MKDEV(major,minor);
+ guint32 devcode = MKDEV(major,minor);
/* have we seen this block device before? */
gpointer bdev = get_hashed_bdevstate(ts, devcode);
lttv_trace_get_hook_field(th, 1));
//guint oper = ltt_event_get_long_unsigned(e,
// lttv_trace_get_hook_field(th, 2));
- guint16 devcode = MKDEV(major,minor);
+ guint32 devcode = MKDEV(major,minor);
/* have we seen this block device before? */
gpointer bdev = get_hashed_bdevstate(ts, devcode);
tab = ptab->tab;
}
- //GtkDirSelection * file_selector = (GtkDirSelection *)gtk_dir_selection_new("Select a trace");
- GtkFileSelection * file_selector = (GtkFileSelection *)gtk_file_selection_new("Select a trace");
- gtk_widget_hide( (file_selector)->file_list->parent) ;
- gtk_file_selection_hide_fileop_buttons(file_selector);
- gtk_window_set_transient_for(GTK_WINDOW(file_selector),
- GTK_WINDOW(mw_data->mwindow));
-
+ /* File open dialog management */
+ GtkFileChooser * file_chooser =
+ GTK_FILE_CHOOSER(
+ gtk_file_chooser_dialog_new ("Select a trace",
+ GTK_WINDOW(mw_data->mwindow),
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
+ NULL));
+
+ gtk_file_chooser_set_show_hidden (file_chooser, TRUE);
if(remember_trace_dir[0] != '\0')
- gtk_file_selection_set_filename(file_selector, remember_trace_dir);
-
- id = gtk_dialog_run(GTK_DIALOG(file_selector));
+ gtk_file_chooser_set_filename(file_chooser, remember_trace_dir);
+
+ id = gtk_dialog_run(GTK_DIALOG(file_chooser));
+
switch(id){
case GTK_RESPONSE_ACCEPT:
case GTK_RESPONSE_OK:
- dir = gtk_file_selection_get_filename (file_selector);
+ dir = gtk_file_chooser_get_filename (file_chooser);
strncpy(remember_trace_dir, dir, PATH_MAX);
strncat(remember_trace_dir, "/", PATH_MAX);
if(!dir || strlen(dir) == 0){
- gtk_widget_destroy((GtkWidget*)file_selector);
break;
}
get_absolute_pathname(dir, abs_path);
lttvwindow_add_trace(tab, trace_v);
}
- gtk_widget_destroy((GtkWidget*)file_selector);
//update current tab
//update_traceset(mw_data);
case GTK_RESPONSE_REJECT:
case GTK_RESPONSE_CANCEL:
default:
- gtk_widget_destroy((GtkWidget*)file_selector);
- break;
+ break;
}
+ gtk_widget_destroy((GtkWidget*)file_chooser);
+
}
/* remove_trace removes a trace from the current traceset if all viewers in
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;
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;
}
}
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;
return g_array_index(p->hlev_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;
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: ");
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");
}
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);
}
}
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);
}
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;
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)
return val;
}
-static void print_simple_summary()
+static void print_simple_summary(void)
{
struct process *pinfo;
GList *pinfos;
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 *));
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);
/* 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;
{
}
+static void arg_sum(void *hook_data)
+{
+}
+
static void init()
{
gboolean result;
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);
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);