aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2010-01-11 15:11:29 -0500
committerSteven Rostedt <rostedt@goodmis.org>2010-01-11 21:02:52 -0500
commitaa893539b357eaffe97bd78afb40166c1a10329e (patch)
treee6dd5e8f76ef02cf5c073caa0dd0db8469b55d13
parentc6762b33dc678e0678b69b6b5307d8694911ab12 (diff)
trace-graph: Added loading of files
Modified trace-graph to open withoun any files loaded. Added an "Load File" menu option to open a file dialog to load a new file. Also allow to load new files. Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r--trace-graph-main.c98
-rw-r--r--trace-graph.c164
-rw-r--r--trace-graph.h3
3 files changed, 204 insertions, 61 deletions
diff --git a/trace-graph-main.c b/trace-graph-main.c
index 80907d2..fdf73fa 100644
--- a/trace-graph-main.c
+++ b/trace-graph-main.c
@@ -2,6 +2,9 @@
2#include <gtk/gtk.h> 2#include <gtk/gtk.h>
3#include <getopt.h> 3#include <getopt.h>
4#include <string.h> 4#include <string.h>
5#include <sys/types.h>
6#include <sys/stat.h>
7#include <unistd.h>
5 8
6#include "trace-cmd.h" 9#include "trace-cmd.h"
7#include "trace-graph.h" 10#include "trace-graph.h"
@@ -13,7 +16,7 @@
13#define TRACE_HEIGHT 600 16#define TRACE_HEIGHT 600
14 17
15#define default_input_file "trace.dat" 18#define default_input_file "trace.dat"
16static char *input_file = default_input_file; 19static char *input_file;
17static struct graph_info *ginfo; 20static struct graph_info *ginfo;
18 21
19void usage(char *prog) 22void usage(char *prog)
@@ -23,6 +26,59 @@ void usage(char *prog)
23 printf(" -i input_file, default is %s\n", default_input_file); 26 printf(" -i input_file, default is %s\n", default_input_file);
24} 27}
25 28
29static struct tracecmd_input *read_tracecmd(gchar *filename)
30{
31 struct tracecmd_input *handle;
32
33 handle = tracecmd_open(filename);
34
35 if (!handle) {
36 warning("can not load %s", filename);
37 return NULL;
38 }
39
40 if (tracecmd_read_headers(handle) < 0) {
41 warning("can not read %s headers", filename);
42 goto failed;
43 }
44
45 if (tracecmd_init_data(handle) < 0) {
46 warning("can not init %s", filename);
47 goto failed;
48 }
49
50 return handle;
51
52 failed:
53 tracecmd_close(handle);
54 return NULL;
55}
56
57/* Callback for the clicked signal of the Load button */
58static void
59load_clicked (gpointer data)
60{
61 struct graph_info *ginfo = data;
62 struct tracecmd_input *handle;
63 GtkWidget *dialog;
64 gchar *filename;
65
66 dialog = gtk_file_chooser_dialog_new("Load File",
67 NULL,
68 GTK_FILE_CHOOSER_ACTION_OPEN,
69 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
70 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
71 NULL);
72 if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
73 filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
74 handle = read_tracecmd(filename);
75 if (handle)
76 trace_graph_load_handle(ginfo, handle);
77 g_free(filename);
78 }
79 gtk_widget_destroy(dialog);
80}
81
26/* Callback for the clicked signal of the Exit button */ 82/* Callback for the clicked signal of the Exit button */
27static void 83static void
28exit_clicked (GtkWidget *widget, gpointer data) 84exit_clicked (GtkWidget *widget, gpointer data)
@@ -51,6 +107,9 @@ events_clicked (gpointer data)
51 gchar **systems = NULL; 107 gchar **systems = NULL;
52 gint *events = NULL; 108 gint *events = NULL;
53 109
110 if (!ginfo->handle)
111 return;
112
54 all_events = ginfo->all_events; 113 all_events = ginfo->all_events;
55 systems = ginfo->systems; 114 systems = ginfo->systems;
56 events = ginfo->event_ids; 115 events = ginfo->event_ids;
@@ -62,7 +121,8 @@ events_clicked (gpointer data)
62 121
63void trace_graph(int argc, char **argv) 122void trace_graph(int argc, char **argv)
64{ 123{
65 struct tracecmd_input *handle; 124 struct tracecmd_input *handle = NULL;
125 struct stat st;
66 GtkWidget *window; 126 GtkWidget *window;
67 GtkWidget *vbox; 127 GtkWidget *vbox;
68 GtkWidget *hbox; 128 GtkWidget *hbox;
@@ -72,6 +132,7 @@ void trace_graph(int argc, char **argv)
72 GtkWidget *sub_item; 132 GtkWidget *sub_item;
73 GtkWidget *widget; 133 GtkWidget *widget;
74 int c; 134 int c;
135 int ret;
75 136
76 while ((c = getopt(argc, argv, "hi:")) != -1) { 137 while ((c = getopt(argc, argv, "hi:")) != -1) {
77 switch(c) { 138 switch(c) {
@@ -87,16 +148,14 @@ void trace_graph(int argc, char **argv)
87 } 148 }
88 } 149 }
89 150
90 handle = tracecmd_open(input_file); 151 if (!input_file) {
91 152 ret = stat(default_input_file, &st);
92 if (!handle) 153 if (ret >= 0)
93 die("error reading header"); 154 input_file = default_input_file;
94 155 }
95 if (tracecmd_read_headers(handle) < 0)
96 return;
97 156
98 if (tracecmd_init_data(handle) < 0) 157 if (input_file)
99 die("failed to init data"); 158 handle = read_tracecmd(input_file);
100 159
101 gtk_init(&argc, &argv); 160 gtk_init(&argc, &argv);
102 161
@@ -129,6 +188,22 @@ void trace_graph(int argc, char **argv)
129 menu = gtk_menu_new(); /* Don't need to show menus */ 188 menu = gtk_menu_new(); /* Don't need to show menus */
130 189
131 190
191 /* --- File - Load Option --- */
192
193 sub_item = gtk_menu_item_new_with_label("Load info");
194
195 /* Add them to the menu */
196 gtk_menu_shell_append(GTK_MENU_SHELL (menu), sub_item);
197
198 /* We can attach the Quit menu item to our exit function */
199 g_signal_connect_swapped (G_OBJECT (sub_item), "activate",
200 G_CALLBACK (load_clicked),
201 (gpointer) ginfo);
202
203 /* We do need to show menu items */
204 gtk_widget_show(sub_item);
205
206
132 /* --- File - Quit Option --- */ 207 /* --- File - Quit Option --- */
133 208
134 sub_item = gtk_menu_item_new_with_label("Quit"); 209 sub_item = gtk_menu_item_new_with_label("Quit");
@@ -144,6 +219,7 @@ void trace_graph(int argc, char **argv)
144 /* We do need to show menu items */ 219 /* We do need to show menu items */
145 gtk_widget_show(sub_item); 220 gtk_widget_show(sub_item);
146 221
222
147 gtk_menu_item_set_submenu(GTK_MENU_ITEM (menu_item), menu); 223 gtk_menu_item_set_submenu(GTK_MENU_ITEM (menu_item), menu);
148 224
149 /* --- end File options --- */ 225 /* --- end File options --- */
diff --git a/trace-graph.c b/trace-graph.c
index b478572..d31f7a5 100644
--- a/trace-graph.c
+++ b/trace-graph.c
@@ -560,6 +560,9 @@ button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer data)
560{ 560{
561 struct graph_info *ginfo = data; 561 struct graph_info *ginfo = data;
562 562
563 if (!ginfo->handle)
564 return FALSE;
565
563 if (event->button == 3) 566 if (event->button == 3)
564 return do_pop_up(widget, event, data); 567 return do_pop_up(widget, event, data);
565 568
@@ -606,6 +609,9 @@ info_button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer data)
606{ 609{
607 struct graph_info *ginfo = data; 610 struct graph_info *ginfo = data;
608 611
612 if (!ginfo->handle)
613 return FALSE;
614
609 if (event->button != 1) 615 if (event->button != 1)
610 return FALSE; 616 return FALSE;
611 617
@@ -630,6 +636,9 @@ info_motion_notify_event(GtkWidget *widget, GdkEventMotion *event, gpointer data
630 GdkModifierType state; 636 GdkModifierType state;
631 gint x, y; 637 gint x, y;
632 638
639 if (!ginfo->handle)
640 return FALSE;
641
633 if (!ginfo->line_active) 642 if (!ginfo->line_active)
634 return FALSE; 643 return FALSE;
635 644
@@ -668,6 +677,9 @@ info_button_release_event(GtkWidget *widget, GdkEventMotion *event, gpointer dat
668 struct graph_info *ginfo = data; 677 struct graph_info *ginfo = data;
669 gint x; 678 gint x;
670 679
680 if (!ginfo->handle)
681 return FALSE;
682
671 x = event->x - ginfo->scrollwin->allocation.x - ginfo->info_scrollwin->allocation.x; 683 x = event->x - ginfo->scrollwin->allocation.x - ginfo->info_scrollwin->allocation.x;
672 684
673 activate_zoom(ginfo, x); 685 activate_zoom(ginfo, x);
@@ -990,6 +1002,9 @@ motion_notify_event(GtkWidget *widget, GdkEventMotion *event, gpointer data)
990 gint x, y; 1002 gint x, y;
991 gint cpu; 1003 gint cpu;
992 1004
1005 if (!ginfo->handle)
1006 return FALSE;
1007
993 update_with_backend(ginfo, ginfo->cpu_data_x, ginfo->cpu_data_y, 1008 update_with_backend(ginfo, ginfo->cpu_data_x, ginfo->cpu_data_y,
994 ginfo->cpu_data_w, ginfo->cpu_data_h); 1009 ginfo->cpu_data_w, ginfo->cpu_data_h);
995 if (event->is_hint) 1010 if (event->is_hint)
@@ -1188,7 +1203,6 @@ static void zoom_in_window(struct graph_info *ginfo, gint start, gint end)
1188static gboolean 1203static gboolean
1189value_changed(GtkWidget *widget, gpointer data) 1204value_changed(GtkWidget *widget, gpointer data)
1190{ 1205{
1191// struct graph_info *ginfo = data;
1192 GtkAdjustment *adj = GTK_ADJUSTMENT(widget); 1206 GtkAdjustment *adj = GTK_ADJUSTMENT(widget);
1193 1207
1194 dprintf(2, "value = %f\n", 1208 dprintf(2, "value = %f\n",
@@ -1295,6 +1309,9 @@ button_release_event(GtkWidget *widget, GdkEventMotion *event, gpointer data)
1295{ 1309{
1296 struct graph_info *ginfo = data; 1310 struct graph_info *ginfo = data;
1297 1311
1312 if (!ginfo->handle)
1313 return FALSE;
1314
1298 activate_zoom(ginfo, event->x); 1315 activate_zoom(ginfo, event->x);
1299 1316
1300 return TRUE; 1317 return TRUE;
@@ -1305,6 +1322,9 @@ leave_notify_event(GtkWidget *widget, GdkEventCrossing *event, gpointer data)
1305{ 1322{
1306 struct graph_info *ginfo = data; 1323 struct graph_info *ginfo = data;
1307 1324
1325 if (!ginfo->handle)
1326 return FALSE;
1327
1308 update_with_backend(ginfo, ginfo->cpu_data_x, ginfo->cpu_data_y, 1328 update_with_backend(ginfo, ginfo->cpu_data_x, ginfo->cpu_data_y,
1309 ginfo->cpu_data_w, ginfo->cpu_data_h); 1329 ginfo->cpu_data_w, ginfo->cpu_data_h);
1310 1330
@@ -1658,6 +1678,9 @@ static void draw_info(struct graph_info *ginfo,
1658 static int read_comms = 1; 1678 static int read_comms = 1;
1659 gint cpu; 1679 gint cpu;
1660 1680
1681 if (!ginfo->handle)
1682 return;
1683
1661 ginfo->resolution = (gdouble)new_width / (gdouble)(ginfo->view_end_time - 1684 ginfo->resolution = (gdouble)new_width / (gdouble)(ginfo->view_end_time -
1662 ginfo->view_start_time); 1685 ginfo->view_start_time);
1663 1686
@@ -1867,6 +1890,8 @@ destroy_event(GtkWidget *widget, gpointer data)
1867{ 1890{
1868 struct graph_info *ginfo = data; 1891 struct graph_info *ginfo = data;
1869 1892
1893 trace_graph_free_info(ginfo);
1894
1870 graph_free_systems(ginfo); 1895 graph_free_systems(ginfo);
1871 graph_free_events(ginfo); 1896 graph_free_events(ginfo);
1872 1897
@@ -1920,20 +1945,16 @@ static void info_draw_cpu_label(struct graph_info *ginfo, gint cpu)
1920static void info_draw_cpu_labels(struct graph_info *ginfo) 1945static void info_draw_cpu_labels(struct graph_info *ginfo)
1921{ 1946{
1922 gint cpu; 1947 gint cpu;
1923#if 0 1948
1924 clear_old_cpu_labels(ginfo); 1949 if (!ginfo->handle)
1925 ginfo->cpu_x = gtk_adjustment_get_value(ginfo->hadj) + 5; 1950 return;
1926#endif
1927 1951
1928 for (cpu = 0; cpu < ginfo->cpus; cpu++) 1952 for (cpu = 0; cpu < ginfo->cpus; cpu++)
1929 info_draw_cpu_label(ginfo, cpu); 1953 info_draw_cpu_label(ginfo, cpu);
1930} 1954}
1931 1955
1932static gboolean 1956static void update_cpu_window(struct graph_info *ginfo)
1933info_configure_event(GtkWidget *widget, GdkEventMotion *event, gpointer data)
1934{ 1957{
1935 struct graph_info *ginfo = data;
1936
1937 if (ginfo->info_pixmap) 1958 if (ginfo->info_pixmap)
1938 g_object_unref(ginfo->info_pixmap); 1959 g_object_unref(ginfo->info_pixmap);
1939 1960
@@ -1953,7 +1974,15 @@ info_configure_event(GtkWidget *widget, GdkEventMotion *event, gpointer data)
1953 1974
1954 gtk_widget_set_size_request(ginfo->info, largest_cpu_label + 10, 1975 gtk_widget_set_size_request(ginfo->info, largest_cpu_label + 10,
1955 ginfo->draw_height); 1976 ginfo->draw_height);
1956 1977}
1978
1979static gboolean
1980info_configure_event(GtkWidget *widget, GdkEventMotion *event, gpointer data)
1981{
1982 struct graph_info *ginfo = data;
1983
1984 update_cpu_window(ginfo);
1985
1957 return TRUE; 1986 return TRUE;
1958} 1987}
1959 1988
@@ -1984,28 +2013,93 @@ create_graph_info(struct graph_info *ginfo)
1984 return info; 2013 return info;
1985} 2014}
1986 2015
1987struct graph_info * 2016void trace_graph_free_info(struct graph_info *ginfo)
1988trace_graph_create_with_callbacks(struct tracecmd_input *handle,
1989 struct graph_callbacks *cbs)
1990{ 2017{
1991 struct graph_info *ginfo; 2018 tracecmd_close(ginfo->handle);
2019 ginfo->handle = NULL;
2020}
2021
2022static int load_handle(struct graph_info *ginfo,
2023 struct tracecmd_input *handle)
2024{
2025 struct record *record;
1992 unsigned long sec, usec; 2026 unsigned long sec, usec;
1993 gint cpu; 2027 gint cpu;
1994 2028
1995 ginfo = g_new0(typeof(*ginfo), 1); 2029 if (!handle)
1996 g_assert(ginfo != NULL); 2030 return -1;
2031
2032 if (ginfo->handle)
2033 trace_graph_free_info(ginfo);
1997 2034
1998 ginfo->handle = handle; 2035 ginfo->handle = handle;
2036
1999 ginfo->pevent = tracecmd_get_pevent(handle); 2037 ginfo->pevent = tracecmd_get_pevent(handle);
2000 ginfo->cpus = tracecmd_cpus(handle); 2038 ginfo->cpus = tracecmd_cpus(handle);
2001
2002 ginfo->all_events = TRUE; 2039 ginfo->all_events = TRUE;
2003 2040
2004 ginfo->callbacks = cbs;
2005
2006 ginfo->start_time = -1ULL; 2041 ginfo->start_time = -1ULL;
2007 ginfo->end_time = 0; 2042 ginfo->end_time = 0;
2008 2043
2044 ginfo->draw_height = CPU_SPACE(ginfo->cpus);
2045
2046 for (cpu = 0; cpu < ginfo->cpus; cpu++) {
2047 record = tracecmd_read_cpu_first(handle, cpu);
2048 if (!record)
2049 continue;
2050
2051 if (record->ts < ginfo->start_time)
2052 ginfo->start_time = record->ts;
2053
2054 free_record(record);
2055 record = tracecmd_read_cpu_last(handle, cpu);
2056
2057 if (record->ts > ginfo->end_time)
2058 ginfo->end_time = record->ts;
2059 free_record(record);
2060 }
2061
2062 convert_nano(ginfo->start_time, &sec, &usec);
2063 dprintf(1, "start=%lu.%06lu ", sec, usec);
2064
2065 convert_nano(ginfo->end_time, &sec, &usec);
2066 dprintf(1, "end=%lu.%06lu\n", sec, usec);
2067
2068 ginfo->view_start_time = ginfo->start_time;
2069 ginfo->view_end_time = ginfo->end_time;
2070
2071 return 0;
2072}
2073
2074int trace_graph_load_handle(struct graph_info *ginfo,
2075 struct tracecmd_input *handle)
2076{
2077
2078 if (load_handle(ginfo, handle) < 0)
2079 return -1;
2080
2081 update_cpu_window(ginfo);
2082 redraw_graph(ginfo);
2083
2084 return 0;
2085}
2086
2087struct graph_info *
2088trace_graph_create_with_callbacks(struct tracecmd_input *handle,
2089 struct graph_callbacks *cbs)
2090{
2091 struct graph_info *ginfo;
2092
2093 ginfo = g_new0(typeof(*ginfo), 1);
2094 g_assert(ginfo != NULL);
2095
2096 if (handle)
2097 load_handle(ginfo, handle);
2098
2099 ginfo->handle = handle;
2100
2101 ginfo->callbacks = cbs;
2102
2009 ginfo->task_filter = filter_task_hash_alloc(); 2103 ginfo->task_filter = filter_task_hash_alloc();
2010 ginfo->hide_tasks = filter_task_hash_alloc(); 2104 ginfo->hide_tasks = filter_task_hash_alloc();
2011 2105
@@ -2017,7 +2111,7 @@ trace_graph_create_with_callbacks(struct tracecmd_input *handle,
2017 GTK_POLICY_AUTOMATIC, 2111 GTK_POLICY_AUTOMATIC,
2018 GTK_POLICY_AUTOMATIC); 2112 GTK_POLICY_AUTOMATIC);
2019 gtk_widget_show(ginfo->scrollwin); 2113 gtk_widget_show(ginfo->scrollwin);
2020 2114 ginfo->hadj = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(ginfo->scrollwin));
2021 2115
2022 ginfo->info_scrollwin = gtk_scrolled_window_new(NULL, 2116 ginfo->info_scrollwin = gtk_scrolled_window_new(NULL,
2023 gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(ginfo->scrollwin))); 2117 gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(ginfo->scrollwin)));
@@ -2036,39 +2130,9 @@ trace_graph_create_with_callbacks(struct tracecmd_input *handle,
2036 2130
2037 gtk_box_pack_start(GTK_BOX (ginfo->widget), ginfo->scrollwin, TRUE, TRUE, 0); 2131 gtk_box_pack_start(GTK_BOX (ginfo->widget), ginfo->scrollwin, TRUE, TRUE, 0);
2038 2132
2039 ginfo->draw_height = CPU_SPACE(ginfo->cpus);
2040 ginfo->hadj = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(ginfo->scrollwin));
2041
2042 gtk_signal_connect(GTK_OBJECT(ginfo->hadj), "value_changed", 2133 gtk_signal_connect(GTK_OBJECT(ginfo->hadj), "value_changed",
2043 (GtkSignalFunc) value_changed, ginfo); 2134 (GtkSignalFunc) value_changed, ginfo);
2044 2135
2045 for (cpu = 0; cpu < ginfo->cpus; cpu++) {
2046 struct record *record;
2047
2048 record = tracecmd_read_cpu_first(handle, cpu);
2049 if (!record)
2050 continue;
2051
2052 if (record->ts < ginfo->start_time)
2053 ginfo->start_time = record->ts;
2054
2055 free_record(record);
2056 record = tracecmd_read_cpu_last(handle, cpu);
2057
2058 if (record->ts > ginfo->end_time)
2059 ginfo->end_time = record->ts;
2060 free_record(record);
2061 }
2062
2063 convert_nano(ginfo->start_time, &sec, &usec);
2064 dprintf(1,"start=%lu.%06lu ", sec, usec);
2065
2066 convert_nano(ginfo->end_time, &sec, &usec);
2067 dprintf(1, "end=%lu.%06lu\n", sec, usec);
2068
2069 ginfo->view_start_time = ginfo->start_time;
2070 ginfo->view_end_time = ginfo->end_time;
2071
2072 ginfo->draw = gtk_drawing_area_new(); 2136 ginfo->draw = gtk_drawing_area_new();
2073 2137
2074 gtk_signal_connect(GTK_OBJECT(ginfo->draw), "expose_event", 2138 gtk_signal_connect(GTK_OBJECT(ginfo->draw), "expose_event",
diff --git a/trace-graph.h b/trace-graph.h
index 33e7355..7cfe0a2 100644
--- a/trace-graph.h
+++ b/trace-graph.h
@@ -114,5 +114,8 @@ void trace_graph_filter_add_remove_task(struct graph_info *info,
114void trace_graph_filter_hide_show_task(struct graph_info *ginfo, 114void trace_graph_filter_hide_show_task(struct graph_info *ginfo,
115 gint pid); 115 gint pid);
116void trace_graph_clear_tasks(struct graph_info *ginfo); 116void trace_graph_clear_tasks(struct graph_info *ginfo);
117void trace_graph_free_info(struct graph_info *ginfo);
118int trace_graph_load_handle(struct graph_info *ginfo,
119 struct tracecmd_input *handle);
117 120
118#endif /* _TRACE_GRAPH_H */ 121#endif /* _TRACE_GRAPH_H */