diff options
-rwxr-xr-x | unit-trace | 8 | ||||
-rw-r--r-- | unit_trace/viz/format.py | 6 | ||||
-rw-r--r-- | unit_trace/viz/viewer.py | 53 | ||||
-rwxr-xr-x | unit_trace/viz/visualizer.py | 10 |
4 files changed, 45 insertions, 32 deletions
@@ -27,12 +27,14 @@ parser.add_option("-o", "--stdout", action="store_true", dest="stdout", | |||
27 | default=False, help="Use stdout_printer") | 27 | default=False, help="Use stdout_printer") |
28 | parser.add_option("-v", "--visual", action="store_true", dest="visualize", | 28 | parser.add_option("-v", "--visual", action="store_true", dest="visualize", |
29 | default=False, help="Use visualizer") | 29 | default=False, help="Use visualizer") |
30 | parser.add_option("-t", "--time-per-maj", default=10000000.0, type=float, | ||
31 | dest="time_per_maj", help="Time interval between major ticks, in the visualizer") | ||
30 | parser.add_option("-c", "--clean", action="store_true", dest="clean", | 32 | parser.add_option("-c", "--clean", action="store_true", dest="clean", |
31 | default=False, help="Use sanitizer to clean garbage records") | 33 | default=False, help="Use sanitizer to clean garbage records") |
32 | parser.add_option("-e", "--earliest", default=0, type=int, dest="earliest", | 34 | parser.add_option("-e", "--earliest", default=0, type=int, dest="earliest", |
33 | help="Earliest timestamp of interst") | 35 | help="Earliest timestamp of interest") |
34 | parser.add_option("-l", "--latest", default=0, type=int, dest="latest", | 36 | parser.add_option("-l", "--latest", default=0, type=int, dest="latest", |
35 | help="Latest timestamp of interst") | 37 | help="Latest timestamp of interest") |
36 | (options, traces) = parser.parse_args() | 38 | (options, traces) = parser.parse_args() |
37 | traces = list(traces) | 39 | traces = list(traces) |
38 | if len(traces) < 1: | 40 | if len(traces) < 1: |
@@ -118,4 +120,4 @@ if options.num_inversions > -1: | |||
118 | # Call visualizer | 120 | # Call visualizer |
119 | if options.visualize is True: | 121 | if options.visualize is True: |
120 | from unit_trace import viz | 122 | from unit_trace import viz |
121 | viz.visualizer.visualizer(stream3) | 123 | viz.visualizer.visualizer(stream3, options.time_per_maj) |
diff --git a/unit_trace/viz/format.py b/unit_trace/viz/format.py index c544e26..d3ed4fd 100644 --- a/unit_trace/viz/format.py +++ b/unit_trace/viz/format.py | |||
@@ -80,9 +80,9 @@ class GraphFormat(object): | |||
80 | SMALL_ARROW_FACTOR = 0.6 | 80 | SMALL_ARROW_FACTOR = 0.6 |
81 | COMPLETION_MARKER_FACTOR = 1.6 | 81 | COMPLETION_MARKER_FACTOR = 1.6 |
82 | 82 | ||
83 | def __init__(self, time_per_maj=DEF_TIME_PER_MAJ, maj_sep=DEF_MAJ_SEP, \ | 83 | def __init__(self, time_per_maj=DEF_TIME_PER_MAJ, maj_sep=DEF_MAJ_SEP, |
84 | min_per_maj=DEF_MIN_PER_MAJ, y_item_size=DEF_Y_ITEM_SIZE, bar_fopts=DEF_FOPTS_BAR, \ | 84 | min_per_maj=DEF_MIN_PER_MAJ, y_item_size=DEF_Y_ITEM_SIZE, bar_fopts=DEF_FOPTS_BAR, |
85 | item_fopts=DEF_FOPTS_ITEM, show_min=False, majfopts=DEF_FOPTS_MAJ, \ | 85 | item_fopts=DEF_FOPTS_ITEM, show_min=False, majfopts=DEF_FOPTS_MAJ, |
86 | minfopts=DEF_FOPTS_MIN): | 86 | minfopts=DEF_FOPTS_MIN): |
87 | self.time_per_maj = time_per_maj | 87 | self.time_per_maj = time_per_maj |
88 | self.maj_sep = maj_sep | 88 | self.maj_sep = maj_sep |
diff --git a/unit_trace/viz/viewer.py b/unit_trace/viz/viewer.py index 4d1fb7f..fb31e8a 100644 --- a/unit_trace/viz/viewer.py +++ b/unit_trace/viz/viewer.py | |||
@@ -122,12 +122,14 @@ class GraphArea(gtk.DrawingArea): | |||
122 | if scale > GraphArea.MAX_ZOOM_IN: | 122 | if scale > GraphArea.MAX_ZOOM_IN: |
123 | scale = GraphArea.MAX_ZOOM_IN | 123 | scale = GraphArea.MAX_ZOOM_IN |
124 | self.set_scale(scale) | 124 | self.set_scale(scale) |
125 | self.config_scrollbars(self.cur_x, self.cur_y, self.scale) | ||
125 | 126 | ||
126 | def zoom_out(self): | 127 | def zoom_out(self): |
127 | scale = self.scale - GraphArea.ZOOM_INCR | 128 | scale = self.scale - GraphArea.ZOOM_INCR |
128 | if scale < GraphArea.MIN_ZOOM_OUT: | 129 | if scale < GraphArea.MIN_ZOOM_OUT: |
129 | scale = GraphArea.MIN_ZOOM_OUT | 130 | scale = GraphArea.MIN_ZOOM_OUT |
130 | self.set_scale(scale) | 131 | self.set_scale(scale) |
132 | self.config_scrollbars(self.cur_x, self.cur_y, self.scale) | ||
131 | 133 | ||
132 | def set_scale(self, scale): | 134 | def set_scale(self, scale): |
133 | if scale == self.scale: | 135 | if scale == self.scale: |
@@ -136,6 +138,22 @@ class GraphArea(gtk.DrawingArea): | |||
136 | self.scale = scale | 138 | self.scale = scale |
137 | self._dirty(0, 0, self.width, self.height) | 139 | self._dirty(0, 0, self.width, self.height) |
138 | 140 | ||
141 | def set_hvalue(self, value): | ||
142 | if self.horizontal is None: | ||
143 | return | ||
144 | |||
145 | value = max(value, self.horizontal.get_lower()) | ||
146 | value = min(value, self.horizontal.get_upper() - self.horizontal.get_page_size()) | ||
147 | self.horizontal.set_value(value) | ||
148 | |||
149 | def set_vvalue(self, value): | ||
150 | if self.vertical is None: | ||
151 | return | ||
152 | |||
153 | value = max(value, self.vertical.get_lower()) | ||
154 | value = min(value, self.vertical.get_upper() - self.vertical.get_page_size()) | ||
155 | self.vertical.set_value(value) | ||
156 | |||
139 | def set_scroll_adjustments(self, widget, horizontal, vertical, data=None): | 157 | def set_scroll_adjustments(self, widget, horizontal, vertical, data=None): |
140 | graph = self.renderer.get_graph() | 158 | graph = self.renderer.get_graph() |
141 | width = graph.get_width() | 159 | width = graph.get_width() |
@@ -143,7 +161,7 @@ class GraphArea(gtk.DrawingArea): | |||
143 | 161 | ||
144 | self.horizontal = horizontal | 162 | self.horizontal = horizontal |
145 | self.vertical = vertical | 163 | self.vertical = vertical |
146 | self.config_scrollbars(self.cur_x, self.cur_y) | 164 | self.config_scrollbars(self.cur_x, self.cur_y, self.scale) |
147 | 165 | ||
148 | if self.horizontal is not None: | 166 | if self.horizontal is not None: |
149 | self.horizontal.connect('value-changed', self.horizontal_value_changed) | 167 | self.horizontal.connect('value-changed', self.horizontal_value_changed) |
@@ -167,21 +185,25 @@ class GraphArea(gtk.DrawingArea): | |||
167 | def size_allocate(self, widget, allocation): | 185 | def size_allocate(self, widget, allocation): |
168 | self.width = allocation.width | 186 | self.width = allocation.width |
169 | self.height = allocation.height | 187 | self.height = allocation.height |
170 | self.config_scrollbars(self.cur_x, self.cur_y) | 188 | self.config_scrollbars(self.cur_x, self.cur_y, self.scale) |
171 | 189 | ||
172 | def config_scrollbars(self, hvalue, vvalue): | 190 | def config_scrollbars(self, hvalue, vvalue, scale): |
173 | graph = self.renderer.get_graph() | 191 | graph = self.renderer.get_graph() |
174 | width = graph.get_width() | 192 | width = graph.get_width() |
175 | height = graph.get_height() | 193 | height = graph.get_height() |
176 | 194 | ||
177 | if self.horizontal is not None: | 195 | if self.horizontal is not None: |
178 | self.horizontal.set_all(hvalue, 0.0, width + self.width, | 196 | self.horizontal.set_all(0.0, 0.0, width, |
179 | graph.get_attrs().maj_sep * GraphArea.HORIZ_STEP_SCROLL_FACTOR, | 197 | graph.get_attrs().maj_sep * GraphArea.HORIZ_STEP_SCROLL_FACTOR / scale, |
180 | graph.get_attrs().maj_sep * GraphArea.HORIZ_PAGE_SCROLL_FACTOR, self.width) | 198 | graph.get_attrs().maj_sep * GraphArea.HORIZ_PAGE_SCROLL_FACTOR / scale, |
199 | self.width / scale) | ||
200 | self.set_hvalue(hvalue) | ||
181 | if self.vertical is not None: | 201 | if self.vertical is not None: |
182 | self.vertical.set_all(vvalue, 0.0, height + self.height, | 202 | self.vertical.set_all(0.0, 0.0, height, |
183 | graph.get_attrs().y_item_size * GraphArea.VERT_STEP_SCROLL_FACTOR, | 203 | graph.get_attrs().y_item_size * GraphArea.VERT_STEP_SCROLL_FACTOR / scale, |
184 | graph.get_attrs().y_item_size * GraphArea.VERT_PAGE_SCROLL_FACTOR, self.height) | 204 | graph.get_attrs().y_item_size * GraphArea.VERT_PAGE_SCROLL_FACTOR / scale, |
205 | self.height / scale) | ||
206 | self.set_vvalue(vvalue) | ||
185 | 207 | ||
186 | def refresh_events(self, sender, new, old, replace): | 208 | def refresh_events(self, sender, new, old, replace): |
187 | """Even if the selected areas change on one graph, they change | 209 | """Even if the selected areas change on one graph, they change |
@@ -485,16 +507,10 @@ class GraphWindow(gtk.ScrolledWindow): | |||
485 | return True | 507 | return True |
486 | 508 | ||
487 | def set_hvalue(self, value): | 509 | def set_hvalue(self, value): |
488 | if self.get_hadjustment() is None: | 510 | self.get_graph_area().set_hvalue(value) |
489 | return | ||
490 | |||
491 | self.get_hadjustment().set_value(value) | ||
492 | 511 | ||
493 | def set_vvalue(self, value): | 512 | def set_vvalue(self, value): |
494 | if self.get_vadjustment() is None: | 513 | self.get_graph_area().set_vvalue(value) |
495 | return | ||
496 | |||
497 | self.get_vadjustment().set_value(value) | ||
498 | 514 | ||
499 | def _scroll_direction(self, keystr): | 515 | def _scroll_direction(self, keystr): |
500 | hadj = self.get_hadjustment() | 516 | hadj = self.get_hadjustment() |
@@ -721,9 +737,6 @@ class MainWindow(gtk.Window): | |||
721 | garea = self.notebook.get_nth_page(i).get_graph_area() | 737 | garea = self.notebook.get_nth_page(i).get_graph_area() |
722 | # Center as much as possible | 738 | # Center as much as possible |
723 | pos = garea.get_graph().get_time_xpos(time) - garea.get_width() / 2.0 | 739 | pos = garea.get_graph().get_time_xpos(time) - garea.get_width() / 2.0 |
724 | pos = max(0, pos) | ||
725 | pos = min(garea.get_graph().get_width(), pos) | ||
726 | |||
727 | self.notebook.get_nth_page(i).set_hvalue(pos) | 740 | self.notebook.get_nth_page(i).set_hvalue(pos) |
728 | else: | 741 | else: |
729 | err_dialog = gtk.MessageDialog(self, gtk.DIALOG_DESTROY_WITH_PARENT, | 742 | err_dialog = gtk.MessageDialog(self, gtk.DIALOG_DESTROY_WITH_PARENT, |
diff --git a/unit_trace/viz/visualizer.py b/unit_trace/viz/visualizer.py index c0186f7..e80b764 100755 --- a/unit_trace/viz/visualizer.py +++ b/unit_trace/viz/visualizer.py | |||
@@ -8,16 +8,14 @@ import format | |||
8 | import pygtk | 8 | import pygtk |
9 | import gtk | 9 | import gtk |
10 | 10 | ||
11 | TIME_PER_MAJ = 10000000 | 11 | def visualizer(stream, time_per_maj): |
12 | |||
13 | def visualizer(stream): | ||
14 | sched = convert.convert_trace_to_schedule(stream) | 12 | sched = convert.convert_trace_to_schedule(stream) |
15 | sched.scan(TIME_PER_MAJ) | 13 | sched.scan(time_per_maj) |
16 | 14 | ||
17 | task_renderer = renderer.Renderer(sched) | 15 | task_renderer = renderer.Renderer(sched) |
18 | task_renderer.prepare_task_graph(attrs=format.GraphFormat(time_per_maj=TIME_PER_MAJ)) | 16 | task_renderer.prepare_task_graph(attrs=format.GraphFormat(time_per_maj=time_per_maj)) |
19 | cpu_renderer = renderer.Renderer(sched) | 17 | cpu_renderer = renderer.Renderer(sched) |
20 | cpu_renderer.prepare_cpu_graph(attrs=format.GraphFormat(time_per_maj=TIME_PER_MAJ)) | 18 | cpu_renderer.prepare_cpu_graph(attrs=format.GraphFormat(time_per_maj=time_per_maj)) |
21 | 19 | ||
22 | window = viewer.MainWindow() | 20 | window = viewer.MainWindow() |
23 | window.set_renderers({'Tasks' : task_renderer, 'CPUs' : cpu_renderer}) | 21 | window.set_renderers({'Tasks' : task_renderer, 'CPUs' : cpu_renderer}) |