aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Herman <hermanjl@cs.unc.edu>2012-10-01 21:35:49 -0400
committerJonathan Herman <hermanjl@cs.unc.edu>2012-10-01 21:35:49 -0400
commitfe1bbdcd1f561aba818c55dfede6b932ff8e4001 (patch)
treeb6f7ebdc4decd48c3ea9a5ab1d05aa70f1a2cbe2
parent7a67bb21f120fc0da6943a5557ef5af06d881ff0 (diff)
Plotter automatically reads all records _at least_ once.
Certain records, like container and task params, must be read on the first pass to set up the plot menus. Before, once the release was found, the plotter would skip right to the first task release. Unfortunately, container params are dropped right after the release record, and were being skipped. Now, the plotter will read up to the release time (or the release time + start offset).
-rw-r--r--kernel-shark.c2
-rw-r--r--trace-graph.c98
2 files changed, 47 insertions, 53 deletions
diff --git a/kernel-shark.c b/kernel-shark.c
index df51c8d..416bf00 100644
--- a/kernel-shark.c
+++ b/kernel-shark.c
@@ -68,6 +68,7 @@ void usage(char *prog)
68 printf(" -c Ignore records before system release\n"); 68 printf(" -c Ignore records before system release\n");
69 printf(" -s (float) Seconds after first record to begin displaying\n"); 69 printf(" -s (float) Seconds after first record to begin displaying\n");
70 printf(" -d (float) Seconds of data to display\n"); 70 printf(" -d (float) Seconds of data to display\n");
71 printf(" NOTE: -s and -d options currently require -c to be specified\n");
71} 72}
72 73
73static gboolean display_warnings; 74static gboolean display_warnings;
@@ -1835,7 +1836,6 @@ void kernel_shark(int argc, char **argv)
1835 int clean; 1836 int clean;
1836 double start = 0.0; 1837 double start = 0.0;
1837 double duration = 0.0; 1838 double duration = 0.0;
1838
1839 1839
1840 g_thread_init(NULL); 1840 g_thread_init(NULL);
1841 gdk_threads_init(); 1841 gdk_threads_init();
diff --git a/trace-graph.c b/trace-graph.c
index 58baf79..6a7f1ff 100644
--- a/trace-graph.c
+++ b/trace-graph.c
@@ -721,7 +721,7 @@ do_pop_up(GtkWidget *widget, GdkEventButton *event, gpointer data)
721 gtk_widget_hide(menu_plot_task); 721 gtk_widget_hide(menu_plot_task);
722 } 722 }
723 723
724 724
725 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 3, 725 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 3,
726 gtk_get_current_event_time()); 726 gtk_get_current_event_time());
727 727
@@ -1072,7 +1072,6 @@ static void draw_info_box(struct graph_info *ginfo, const gchar *buffer,
1072 gint width, height; 1072 gint width, height;
1073 GdkPixmap *pix; 1073 GdkPixmap *pix;
1074 static GdkGC *pix_bg; 1074 static GdkGC *pix_bg;
1075 gint view_width;
1076 gint view_start; 1075 gint view_start;
1077 1076
1078 if (!pix_bg) { 1077 if (!pix_bg) {
@@ -1093,7 +1092,6 @@ static void draw_info_box(struct graph_info *ginfo, const gchar *buffer,
1093 height += PLOT_BOARDER * 2; 1092 height += PLOT_BOARDER * 2;
1094 1093
1095 view_start = gtk_adjustment_get_value(ginfo->hadj); 1094 view_start = gtk_adjustment_get_value(ginfo->hadj);
1096 view_width = gtk_adjustment_get_page_size(ginfo->hadj);
1097 if (x > view_start + width) 1095 if (x > view_start + width)
1098 x -= width; 1096 x -= width;
1099 1097
@@ -1117,7 +1115,7 @@ static void draw_info_box(struct graph_info *ginfo, const gchar *buffer,
1117 TRUE, 1115 TRUE,
1118 0, 0, 1116 0, 0,
1119 width, height); 1117 width, height);
1120 1118
1121 gdk_draw_rectangle(pix, 1119 gdk_draw_rectangle(pix,
1122 ginfo->draw->style->black_gc, 1120 ginfo->draw->style->black_gc,
1123 FALSE, 1121 FALSE,
@@ -1137,7 +1135,6 @@ static void draw_info_box(struct graph_info *ginfo, const gchar *buffer,
1137static void draw_plot_info(struct graph_info *ginfo, struct graph_plot *plot, 1135static void draw_plot_info(struct graph_info *ginfo, struct graph_plot *plot,
1138 gint x, gint y) 1136 gint x, gint y)
1139{ 1137{
1140 struct pevent *pevent;
1141 guint64 time; 1138 guint64 time;
1142 unsigned long sec, usec; 1139 unsigned long sec, usec;
1143 struct trace_seq s; 1140 struct trace_seq s;
@@ -1145,8 +1142,6 @@ static void draw_plot_info(struct graph_info *ginfo, struct graph_plot *plot,
1145 time = convert_x_to_time(ginfo, x); 1142 time = convert_x_to_time(ginfo, x);
1146 convert_nano(time, &sec, &usec); 1143 convert_nano(time, &sec, &usec);
1147 1144
1148 pevent = ginfo->pevent;
1149
1150 trace_seq_init(&s); 1145 trace_seq_init(&s);
1151 1146
1152 dprintf(3, "start=%llu end=%llu time=%llu, vstart: %llu, vend: %llu\n", 1147 dprintf(3, "start=%llu end=%llu time=%llu, vstart: %llu, vend: %llu\n",
@@ -1168,7 +1163,6 @@ static void draw_plot_info(struct graph_info *ginfo, struct graph_plot *plot,
1168 1163
1169static void draw_latency(struct graph_info *ginfo, gint x, gint y) 1164static void draw_latency(struct graph_info *ginfo, gint x, gint y)
1170{ 1165{
1171 struct pevent *pevent;
1172 unsigned long sec, usec; 1166 unsigned long sec, usec;
1173 struct trace_seq s; 1167 struct trace_seq s;
1174 gboolean neg; 1168 gboolean neg;
@@ -1187,8 +1181,6 @@ static void draw_latency(struct graph_info *ginfo, gint x, gint y)
1187 1181
1188 convert_nano(time, &sec, &usec); 1182 convert_nano(time, &sec, &usec);
1189 1183
1190 pevent = ginfo->pevent;
1191
1192 trace_seq_init(&s); 1184 trace_seq_init(&s);
1193 trace_seq_printf(&s, "Diff: %s%ld.%06lu secs", neg ? "-":"", sec, usec); 1185 trace_seq_printf(&s, "Diff: %s%ld.%06lu secs", neg ? "-":"", sec, usec);
1194 1186
@@ -1860,7 +1852,7 @@ static void draw_plot(struct graph_info *ginfo, struct graph_plot *plot,
1860} 1852}
1861 1853
1862/* 1854/*
1863 * TODO: this method needs refactoring 1855 * TODO: this method needs refactoring and splitting
1864 */ 1856 */
1865static void draw_hashed_plots(struct graph_info *ginfo) 1857static void draw_hashed_plots(struct graph_info *ginfo)
1866{ 1858{
@@ -1868,8 +1860,8 @@ static void draw_hashed_plots(struct graph_info *ginfo)
1868 struct record *record; 1860 struct record *record;
1869 struct plot_hash *hash; 1861 struct plot_hash *hash;
1870 struct plot_list *list; 1862 struct plot_list *list;
1871 unsigned long long old_start, max_time, min_time; 1863 unsigned long long max_time, min_time;
1872 gdouble duration, start; 1864 gdouble start, duration;
1873 1865
1874 start = ginfo->rtg_info.start_offset; 1866 start = ginfo->rtg_info.start_offset;
1875 duration = ginfo->rtg_info.duration; 1867 duration = ginfo->rtg_info.duration;
@@ -1877,11 +1869,26 @@ static void draw_hashed_plots(struct graph_info *ginfo)
1877 1869
1878 set_cpus_to_rts(ginfo, ginfo->view_start_time); 1870 set_cpus_to_rts(ginfo, ginfo->view_start_time);
1879 1871
1880 max_time = ginfo->view_end_time;
1881 min_time = ginfo->view_start_time; 1872 min_time = ginfo->view_start_time;
1873 max_time = ginfo->view_end_time;
1874 if (ginfo->rtg_info.start_time && duration) {
1875 max_time = MIN(max_time, min_time + duration * NSECS_PER_SEC);
1876 }
1882 1877
1883 while ((record = tracecmd_read_next_data(ginfo->handle, &cpu))) { 1878 while ((record = tracecmd_read_next_data(ginfo->handle, &cpu))) {
1884 int first = ginfo->rtg_info.start_time == 0; 1879 unsigned long long dull, rel;
1880 char *dchar;
1881 int dint;
1882 /* These methods add to the lists of tasks / containers
1883 * in the system whenever a new param record is found.
1884 * Skipping these records would be very bad, so parse
1885 * them always
1886 */
1887#define ARG ginfo,record, &pid
1888 rt_graph_check_task_param(ARG, &dull, &dull);
1889 rt_graph_check_container_param(ARG, &dchar);
1890 rt_graph_check_server_param(ARG, &dint, &dull, &dull);
1891#undef ARG
1885 1892
1886 if (get_rts(ginfo, record) < min_time) { 1893 if (get_rts(ginfo, record) < min_time) {
1887 free_record(record); 1894 free_record(record);
@@ -1892,46 +1899,36 @@ static void draw_hashed_plots(struct graph_info *ginfo)
1892 1899
1893 if (get_rts(ginfo, record) > max_time) { 1900 if (get_rts(ginfo, record) > max_time) {
1894 free_record(record); 1901 free_record(record);
1895 dprintf(3, "%llu > %llu, breaking\n", 1902 dprintf(3, "%llu > %llu, returning\n",
1896 get_rts(ginfo, record), min_time); 1903 get_rts(ginfo, record), min_time);
1897 break; 1904 return;
1898 } 1905 }
1899 1906
1900 // TODO: hack to clean up until first release, make unhacky 1907 if (clean && (ginfo->rtg_info.start_time == 0 ||
1901 if (ginfo->rtg_info.clean_records && 1908 get_rts(ginfo, record) < ginfo->rtg_info.start_time)) {
1902 (ginfo->rtg_info.start_time == 0 || get_rts(ginfo, record) < ginfo->rtg_info.start_time)) { 1909
1903 unsigned long long dull, rel;
1904 char *dchar;
1905 int dint;
1906
1907 // These methods add to the lists of tasks / containers
1908 // in the system whenever a new param record is found.
1909 // Skipping these records would be very bad, so parse
1910 // them here if we are cleaning. Otherwise, draw_plot
1911 // will take care of this
1912#define ARG ginfo,record, &pid
1913 rt_graph_check_task_param(ARG, &dull, &dull);
1914 rt_graph_check_container_param(ARG, &dchar);
1915 rt_graph_check_server_param(ARG, &dint, &dull, &dull);
1916#undef ARG
1917 if (rt_graph_check_sys_release(ginfo, record, &rel)) { 1910 if (rt_graph_check_sys_release(ginfo, record, &rel)) {
1918 min_time = rel; 1911 min_time = rel + start * NSECS_PER_SEC;
1919 ginfo->rtg_info.start_time = min_time; 1912 ginfo->rtg_info.start_time = min_time;
1920 ginfo->view_start_time = min_time; 1913 ginfo->view_start_time = min_time;
1921 ginfo->start_time = min_time; 1914 ginfo->start_time = min_time;
1922 1915
1923 dprintf(3, "found release at %llu, min_time now %llu \n", 1916 dprintf(3, "found release at %llu, min_time: %llu\n",
1924 rel, min_time); 1917 rel, min_time);
1925 1918
1926 if (ginfo->rtg_info.duration) { 1919 if (ginfo->rtg_info.duration) {
1927 max_time = MIN(max_time, min_time + ginfo->rtg_info.duration * NSECS_PER_SEC); 1920 /* This will force a resize of the
1928 ginfo->view_end_time = max_time; 1921 * viewing window during the next pass
1929 ginfo->end_time = max_time; 1922 */
1930 } 1923 ginfo->view_end_time = MIN(max_time,
1931 if (first) { 1924 min_time + duration * NSECS_PER_SEC);
1932 free_record(record);
1933 return;
1934 } 1925 }
1926
1927 /* Continue reading up to the minimum time to
1928 * grab any task / container param records which
1929 * have yet to be read
1930 */
1931 max_time = MAX(min_time,get_rts(ginfo, record));
1935 } 1932 }
1936 1933
1937 free_record(record); 1934 free_record(record);
@@ -1957,11 +1954,12 @@ static void draw_hashed_plots(struct graph_info *ginfo)
1957 } 1954 }
1958 } 1955 }
1959 for (list = ginfo->all_recs; list; list = list->next) { 1956 for (list = ginfo->all_recs; list; list = list->next) {
1960 // TODO: hacky assumption that everything else can be 1957 /* TODO: hacky assumption that everything else can be
1961 // reached via previous hashes 1958 * reached via previous hashes
1962 // Should be an additional hashed list where things are 1959 * Should be an additional hashed list where things are
1963 // added with arbitrary numbers, and a pevent_other_id 1960 * added with arbitrary numbers, and a pevent_other_id
1964 // which uses id ranges x < . < y to parse cids or lids 1961 * which uses id ranges x < . < y to parse cids or lids
1962 */
1965 if (list->plot->type == PLOT_TYPE_SERVER_TASK || 1963 if (list->plot->type == PLOT_TYPE_SERVER_TASK ||
1966 list->plot->type == PLOT_TYPE_SERVER_CPU) { 1964 list->plot->type == PLOT_TYPE_SERVER_CPU) {
1967 draw_plot(ginfo, list->plot, record); 1965 draw_plot(ginfo, list->plot, record);
@@ -1974,11 +1972,7 @@ static void draw_hashed_plots(struct graph_info *ginfo)
1974 1972
1975static void draw_plots(struct graph_info *ginfo, gint new_width) 1973static void draw_plots(struct graph_info *ginfo, gint new_width)
1976{ 1974{
1977 struct plot_list *list;
1978 struct graph_plot *plot; 1975 struct graph_plot *plot;
1979 struct record *record;
1980 struct plot_hash *hash;
1981 gint cpu;
1982 gint i; 1976 gint i;
1983 1977
1984 /* Initialize plots */ 1978 /* Initialize plots */