diff options
| author | Frederic Weisbecker <fweisbec@gmail.com> | 2010-07-25 20:29:44 -0400 |
|---|---|---|
| committer | Frederic Weisbecker <fweisbec@gmail.com> | 2010-08-01 19:31:59 -0400 |
| commit | df92b40848616596c50b3b9e6d6ce8252af606ee (patch) | |
| tree | bf2b02ac9feb9478b32f9e195aa65afd3a632d30 /tools/perf/scripts/python | |
| parent | 699b6d922c7d07f0c1c9041b489e884b5dd5fee5 (diff) | |
perf, sched migration: Librarize the GUI class
Export the GUI facility in the common library path. It is
going to be useful for other scheduler views.
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Nikhil Rao <ncrao@google.com>
Cc: Tom Zanussi <tzanussi@gmail.com>
Diffstat (limited to 'tools/perf/scripts/python')
| -rw-r--r-- | tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/SchedGui.py | 184 | ||||
| -rw-r--r-- | tools/perf/scripts/python/sched-migration.py | 180 |
2 files changed, 189 insertions, 175 deletions
diff --git a/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/SchedGui.py b/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/SchedGui.py new file mode 100644 index 000000000000..ae9a56e43e05 --- /dev/null +++ b/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/SchedGui.py | |||
| @@ -0,0 +1,184 @@ | |||
| 1 | # SchedGui.py - Python extension for perf trace, basic GUI code for | ||
| 2 | # traces drawing and overview. | ||
| 3 | # | ||
| 4 | # Copyright (C) 2010 by Frederic Weisbecker <fweisbec@gmail.com> | ||
| 5 | # | ||
| 6 | # This software is distributed under the terms of the GNU General | ||
| 7 | # Public License ("GPL") version 2 as published by the Free Software | ||
| 8 | # Foundation. | ||
| 9 | |||
| 10 | |||
| 11 | try: | ||
| 12 | import wx | ||
| 13 | except ImportError: | ||
| 14 | raise ImportError, "You need to install the wxpython lib for this script" | ||
| 15 | |||
| 16 | |||
| 17 | class RootFrame(wx.Frame): | ||
| 18 | Y_OFFSET = 100 | ||
| 19 | RECT_HEIGHT = 100 | ||
| 20 | RECT_SPACE = 50 | ||
| 21 | EVENT_MARKING_WIDTH = 5 | ||
| 22 | |||
| 23 | def __init__(self, sched_tracer, title, parent = None, id = -1): | ||
| 24 | wx.Frame.__init__(self, parent, id, title) | ||
| 25 | |||
| 26 | (self.screen_width, self.screen_height) = wx.GetDisplaySize() | ||
| 27 | self.screen_width -= 10 | ||
| 28 | self.screen_height -= 10 | ||
| 29 | self.zoom = 0.5 | ||
| 30 | self.scroll_scale = 20 | ||
| 31 | self.sched_tracer = sched_tracer | ||
| 32 | self.sched_tracer.set_root_win(self) | ||
| 33 | (self.ts_start, self.ts_end) = sched_tracer.interval() | ||
| 34 | self.update_width_virtual() | ||
| 35 | self.nr_rects = sched_tracer.nr_rectangles() + 1 | ||
| 36 | self.height_virtual = RootFrame.Y_OFFSET + (self.nr_rects * (RootFrame.RECT_HEIGHT + RootFrame.RECT_SPACE)) | ||
| 37 | |||
| 38 | # whole window panel | ||
| 39 | self.panel = wx.Panel(self, size=(self.screen_width, self.screen_height)) | ||
| 40 | |||
| 41 | # scrollable container | ||
| 42 | self.scroll = wx.ScrolledWindow(self.panel) | ||
| 43 | self.scroll.SetScrollbars(self.scroll_scale, self.scroll_scale, self.width_virtual / self.scroll_scale, self.height_virtual / self.scroll_scale) | ||
| 44 | self.scroll.EnableScrolling(True, True) | ||
| 45 | self.scroll.SetFocus() | ||
| 46 | |||
| 47 | # scrollable drawing area | ||
| 48 | self.scroll_panel = wx.Panel(self.scroll, size=(self.screen_width - 15, self.screen_height / 2)) | ||
| 49 | self.scroll_panel.Bind(wx.EVT_PAINT, self.on_paint) | ||
| 50 | self.scroll_panel.Bind(wx.EVT_KEY_DOWN, self.on_key_press) | ||
| 51 | self.scroll_panel.Bind(wx.EVT_LEFT_DOWN, self.on_mouse_down) | ||
| 52 | self.scroll.Bind(wx.EVT_PAINT, self.on_paint) | ||
| 53 | self.scroll.Bind(wx.EVT_KEY_DOWN, self.on_key_press) | ||
| 54 | self.scroll.Bind(wx.EVT_LEFT_DOWN, self.on_mouse_down) | ||
| 55 | |||
| 56 | self.scroll.Fit() | ||
| 57 | self.Fit() | ||
| 58 | |||
| 59 | self.scroll_panel.SetDimensions(-1, -1, self.width_virtual, self.height_virtual, wx.SIZE_USE_EXISTING) | ||
| 60 | |||
| 61 | self.txt = None | ||
| 62 | |||
| 63 | self.Show(True) | ||
| 64 | |||
| 65 | def us_to_px(self, val): | ||
| 66 | return val / (10 ** 3) * self.zoom | ||
| 67 | |||
| 68 | def px_to_us(self, val): | ||
| 69 | return (val / self.zoom) * (10 ** 3) | ||
| 70 | |||
| 71 | def scroll_start(self): | ||
| 72 | (x, y) = self.scroll.GetViewStart() | ||
| 73 | return (x * self.scroll_scale, y * self.scroll_scale) | ||
| 74 | |||
| 75 | def scroll_start_us(self): | ||
| 76 | (x, y) = self.scroll_start() | ||
| 77 | return self.px_to_us(x) | ||
| 78 | |||
| 79 | def paint_rectangle_zone(self, nr, color, top_color, start, end): | ||
| 80 | offset_px = self.us_to_px(start - self.ts_start) | ||
| 81 | width_px = self.us_to_px(end - self.ts_start) | ||
| 82 | |||
| 83 | offset_py = RootFrame.Y_OFFSET + (nr * (RootFrame.RECT_HEIGHT + RootFrame.RECT_SPACE)) | ||
| 84 | width_py = RootFrame.RECT_HEIGHT | ||
| 85 | |||
| 86 | dc = self.dc | ||
| 87 | |||
| 88 | if top_color is not None: | ||
| 89 | (r, g, b) = top_color | ||
| 90 | top_color = wx.Colour(r, g, b) | ||
| 91 | brush = wx.Brush(top_color, wx.SOLID) | ||
| 92 | dc.SetBrush(brush) | ||
| 93 | dc.DrawRectangle(offset_px, offset_py, width_px, RootFrame.EVENT_MARKING_WIDTH) | ||
| 94 | width_py -= RootFrame.EVENT_MARKING_WIDTH | ||
| 95 | offset_py += RootFrame.EVENT_MARKING_WIDTH | ||
| 96 | |||
| 97 | (r ,g, b) = color | ||
| 98 | color = wx.Colour(r, g, b) | ||
| 99 | brush = wx.Brush(color, wx.SOLID) | ||
| 100 | dc.SetBrush(brush) | ||
| 101 | dc.DrawRectangle(offset_px, offset_py, width_px, width_py) | ||
| 102 | |||
| 103 | def update_rectangles(self, dc, start, end): | ||
| 104 | start += self.ts_start | ||
| 105 | end += self.ts_start | ||
| 106 | self.sched_tracer.fill_zone(start, end) | ||
| 107 | |||
| 108 | def on_paint(self, event): | ||
| 109 | dc = wx.PaintDC(self.scroll_panel) | ||
| 110 | self.dc = dc | ||
| 111 | |||
| 112 | width = min(self.width_virtual, self.screen_width) | ||
| 113 | (x, y) = self.scroll_start() | ||
| 114 | start = self.px_to_us(x) | ||
| 115 | end = self.px_to_us(x + width) | ||
| 116 | self.update_rectangles(dc, start, end) | ||
| 117 | |||
| 118 | def rect_from_ypixel(self, y): | ||
| 119 | y -= RootFrame.Y_OFFSET | ||
| 120 | rect = y / (RootFrame.RECT_HEIGHT + RootFrame.RECT_SPACE) | ||
| 121 | height = y % (RootFrame.RECT_HEIGHT + RootFrame.RECT_SPACE) | ||
| 122 | |||
| 123 | if rect < 0 or rect > self.nr_rects - 1 or height > RootFrame.RECT_HEIGHT: | ||
| 124 | return -1 | ||
| 125 | |||
| 126 | return rect | ||
| 127 | |||
| 128 | def update_summary(self, txt): | ||
| 129 | if self.txt: | ||
| 130 | self.txt.Destroy() | ||
| 131 | self.txt = wx.StaticText(self.panel, -1, txt, (0, (self.screen_height / 2) + 50)) | ||
| 132 | |||
| 133 | |||
| 134 | def on_mouse_down(self, event): | ||
| 135 | (x, y) = event.GetPositionTuple() | ||
| 136 | rect = self.rect_from_ypixel(y) | ||
| 137 | if rect == -1: | ||
| 138 | return | ||
| 139 | |||
| 140 | t = self.px_to_us(x) + self.ts_start | ||
| 141 | |||
| 142 | self.sched_tracer.mouse_down(rect, t) | ||
| 143 | |||
| 144 | |||
| 145 | def update_width_virtual(self): | ||
| 146 | self.width_virtual = self.us_to_px(self.ts_end - self.ts_start) | ||
| 147 | |||
| 148 | def __zoom(self, x): | ||
| 149 | self.update_width_virtual() | ||
| 150 | (xpos, ypos) = self.scroll.GetViewStart() | ||
| 151 | xpos = self.us_to_px(x) / self.scroll_scale | ||
| 152 | self.scroll.SetScrollbars(self.scroll_scale, self.scroll_scale, self.width_virtual / self.scroll_scale, self.height_virtual / self.scroll_scale, xpos, ypos) | ||
| 153 | self.Refresh() | ||
| 154 | |||
| 155 | def zoom_in(self): | ||
| 156 | x = self.scroll_start_us() | ||
| 157 | self.zoom *= 2 | ||
| 158 | self.__zoom(x) | ||
| 159 | |||
| 160 | def zoom_out(self): | ||
| 161 | x = self.scroll_start_us() | ||
| 162 | self.zoom /= 2 | ||
| 163 | self.__zoom(x) | ||
| 164 | |||
| 165 | |||
| 166 | def on_key_press(self, event): | ||
| 167 | key = event.GetRawKeyCode() | ||
| 168 | if key == ord("+"): | ||
| 169 | self.zoom_in() | ||
| 170 | return | ||
| 171 | if key == ord("-"): | ||
| 172 | self.zoom_out() | ||
| 173 | return | ||
| 174 | |||
| 175 | key = event.GetKeyCode() | ||
| 176 | (x, y) = self.scroll.GetViewStart() | ||
| 177 | if key == wx.WXK_RIGHT: | ||
| 178 | self.scroll.Scroll(x + 1, y) | ||
| 179 | elif key == wx.WXK_LEFT: | ||
| 180 | self.scroll.Scroll(x - 1, y) | ||
| 181 | elif key == wx.WXK_DOWN: | ||
| 182 | self.scroll.Scroll(x, y + 1) | ||
| 183 | elif key == wx.WXK_UP: | ||
| 184 | self.scroll.Scroll(x, y - 1) | ||
diff --git a/tools/perf/scripts/python/sched-migration.py b/tools/perf/scripts/python/sched-migration.py index 6d7281a7de33..983463050f04 100644 --- a/tools/perf/scripts/python/sched-migration.py +++ b/tools/perf/scripts/python/sched-migration.py | |||
| @@ -6,14 +6,11 @@ | |||
| 6 | # | 6 | # |
| 7 | # perf trace event handlers have been generated by perf trace -g python | 7 | # perf trace event handlers have been generated by perf trace -g python |
| 8 | # | 8 | # |
| 9 | # The whole is licensed under the terms of the GNU GPL License version 2 | 9 | # This software is distributed under the terms of the GNU General |
| 10 | # Public License ("GPL") version 2 as published by the Free Software | ||
| 11 | # Foundation. | ||
| 10 | 12 | ||
| 11 | 13 | ||
| 12 | try: | ||
| 13 | import wx | ||
| 14 | except ImportError: | ||
| 15 | raise ImportError, "You need to install the wxpython lib for this script" | ||
| 16 | |||
| 17 | import os | 14 | import os |
| 18 | import sys | 15 | import sys |
| 19 | 16 | ||
| @@ -22,178 +19,11 @@ from UserList import UserList | |||
| 22 | 19 | ||
| 23 | sys.path.append(os.environ['PERF_EXEC_PATH'] + \ | 20 | sys.path.append(os.environ['PERF_EXEC_PATH'] + \ |
| 24 | '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') | 21 | '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') |
| 22 | sys.path.append('scripts/python/Perf-Trace-Util/lib/Perf/Trace') | ||
| 25 | 23 | ||
| 26 | from perf_trace_context import * | 24 | from perf_trace_context import * |
| 27 | from Core import * | 25 | from Core import * |
| 28 | 26 | from SchedGui import * | |
| 29 | class RootFrame(wx.Frame): | ||
| 30 | Y_OFFSET = 100 | ||
| 31 | RECT_HEIGHT = 100 | ||
| 32 | RECT_SPACE = 50 | ||
| 33 | EVENT_MARKING_WIDTH = 5 | ||
| 34 | |||
| 35 | def __init__(self, sched_tracer, title, parent = None, id = -1): | ||
| 36 | wx.Frame.__init__(self, parent, id, title) | ||
| 37 | |||
| 38 | (self.screen_width, self.screen_height) = wx.GetDisplaySize() | ||
| 39 | self.screen_width -= 10 | ||
| 40 | self.screen_height -= 10 | ||
| 41 | self.zoom = 0.5 | ||
| 42 | self.scroll_scale = 20 | ||
| 43 | self.sched_tracer = sched_tracer | ||
| 44 | self.sched_tracer.set_root_win(self) | ||
| 45 | (self.ts_start, self.ts_end) = sched_tracer.interval() | ||
| 46 | self.update_width_virtual() | ||
| 47 | self.nr_rects = sched_tracer.nr_rectangles() + 1 | ||
| 48 | self.height_virtual = RootFrame.Y_OFFSET + (self.nr_rects * (RootFrame.RECT_HEIGHT + RootFrame.RECT_SPACE)) | ||
| 49 | |||
| 50 | # whole window panel | ||
| 51 | self.panel = wx.Panel(self, size=(self.screen_width, self.screen_height)) | ||
| 52 | |||
| 53 | # scrollable container | ||
| 54 | self.scroll = wx.ScrolledWindow(self.panel) | ||
| 55 | self.scroll.SetScrollbars(self.scroll_scale, self.scroll_scale, self.width_virtual / self.scroll_scale, self.height_virtual / self.scroll_scale) | ||
| 56 | self.scroll.EnableScrolling(True, True) | ||
| 57 | self.scroll.SetFocus() | ||
| 58 | |||
| 59 | # scrollable drawing area | ||
| 60 | self.scroll_panel = wx.Panel(self.scroll, size=(self.screen_width - 15, self.screen_height / 2)) | ||
| 61 | self.scroll_panel.Bind(wx.EVT_PAINT, self.on_paint) | ||
| 62 | self.scroll_panel.Bind(wx.EVT_KEY_DOWN, self.on_key_press) | ||
| 63 | self.scroll_panel.Bind(wx.EVT_LEFT_DOWN, self.on_mouse_down) | ||
| 64 | self.scroll.Bind(wx.EVT_PAINT, self.on_paint) | ||
| 65 | self.scroll.Bind(wx.EVT_KEY_DOWN, self.on_key_press) | ||
| 66 | self.scroll.Bind(wx.EVT_LEFT_DOWN, self.on_mouse_down) | ||
| 67 | |||
| 68 | self.scroll.Fit() | ||
| 69 | self.Fit() | ||
| 70 | |||
| 71 | self.scroll_panel.SetDimensions(-1, -1, self.width_virtual, self.height_virtual, wx.SIZE_USE_EXISTING) | ||
| 72 | |||
| 73 | self.txt = None | ||
| 74 | |||
| 75 | self.Show(True) | ||
| 76 | |||
| 77 | def us_to_px(self, val): | ||
| 78 | return val / (10 ** 3) * self.zoom | ||
| 79 | |||
| 80 | def px_to_us(self, val): | ||
| 81 | return (val / self.zoom) * (10 ** 3) | ||
| 82 | |||
| 83 | def scroll_start(self): | ||
| 84 | (x, y) = self.scroll.GetViewStart() | ||
| 85 | return (x * self.scroll_scale, y * self.scroll_scale) | ||
| 86 | |||
| 87 | def scroll_start_us(self): | ||
| 88 | (x, y) = self.scroll_start() | ||
| 89 | return self.px_to_us(x) | ||
| 90 | |||
| 91 | def paint_rectangle_zone(self, nr, color, top_color, start, end): | ||
| 92 | offset_px = self.us_to_px(start - self.ts_start) | ||
| 93 | width_px = self.us_to_px(end - self.ts_start) | ||
| 94 | |||
| 95 | offset_py = RootFrame.Y_OFFSET + (nr * (RootFrame.RECT_HEIGHT + RootFrame.RECT_SPACE)) | ||
| 96 | width_py = RootFrame.RECT_HEIGHT | ||
| 97 | |||
| 98 | dc = self.dc | ||
| 99 | |||
| 100 | if top_color is not None: | ||
| 101 | (r, g, b) = top_color | ||
| 102 | top_color = wx.Colour(r, g, b) | ||
| 103 | brush = wx.Brush(top_color, wx.SOLID) | ||
| 104 | dc.SetBrush(brush) | ||
| 105 | dc.DrawRectangle(offset_px, offset_py, width_px, RootFrame.EVENT_MARKING_WIDTH) | ||
| 106 | width_py -= RootFrame.EVENT_MARKING_WIDTH | ||
| 107 | offset_py += RootFrame.EVENT_MARKING_WIDTH | ||
| 108 | |||
| 109 | (r ,g, b) = color | ||
| 110 | color = wx.Colour(r, g, b) | ||
| 111 | brush = wx.Brush(color, wx.SOLID) | ||
| 112 | dc.SetBrush(brush) | ||
| 113 | dc.DrawRectangle(offset_px, offset_py, width_px, width_py) | ||
| 114 | |||
| 115 | def update_rectangles(self, dc, start, end): | ||
| 116 | start += self.ts_start | ||
| 117 | end += self.ts_start | ||
| 118 | self.sched_tracer.fill_zone(start, end) | ||
| 119 | |||
| 120 | def on_paint(self, event): | ||
| 121 | dc = wx.PaintDC(self.scroll_panel) | ||
| 122 | self.dc = dc | ||
| 123 | |||
| 124 | width = min(self.width_virtual, self.screen_width) | ||
| 125 | (x, y) = self.scroll_start() | ||
| 126 | start = self.px_to_us(x) | ||
| 127 | end = self.px_to_us(x + width) | ||
| 128 | self.update_rectangles(dc, start, end) | ||
| 129 | |||
| 130 | def rect_from_ypixel(self, y): | ||
| 131 | y -= RootFrame.Y_OFFSET | ||
| 132 | rect = y / (RootFrame.RECT_HEIGHT + RootFrame.RECT_SPACE) | ||
| 133 | height = y % (RootFrame.RECT_HEIGHT + RootFrame.RECT_SPACE) | ||
| 134 | |||
| 135 | if rect < 0 or rect > self.nr_rects - 1 or height > RootFrame.RECT_HEIGHT: | ||
| 136 | return -1 | ||
| 137 | |||
| 138 | return rect | ||
| 139 | |||
| 140 | def update_summary(self, txt): | ||
| 141 | if self.txt: | ||
| 142 | self.txt.Destroy() | ||
| 143 | self.txt = wx.StaticText(self.panel, -1, txt, (0, (self.screen_height / 2) + 50)) | ||
| 144 | |||
| 145 | |||
| 146 | def on_mouse_down(self, event): | ||
| 147 | (x, y) = event.GetPositionTuple() | ||
| 148 | rect = self.rect_from_ypixel(y) | ||
| 149 | if rect == -1: | ||
| 150 | return | ||
| 151 | |||
| 152 | t = self.px_to_us(x) + self.ts_start | ||
| 153 | |||
| 154 | self.sched_tracer.mouse_down(rect, t) | ||
| 155 | |||
| 156 | |||
| 157 | def update_width_virtual(self): | ||
| 158 | self.width_virtual = self.us_to_px(self.ts_end - self.ts_start) | ||
| 159 | |||
| 160 | def __zoom(self, x): | ||
| 161 | self.update_width_virtual() | ||
| 162 | (xpos, ypos) = self.scroll.GetViewStart() | ||
| 163 | xpos = self.us_to_px(x) / self.scroll_scale | ||
| 164 | self.scroll.SetScrollbars(self.scroll_scale, self.scroll_scale, self.width_virtual / self.scroll_scale, self.height_virtual / self.scroll_scale, xpos, ypos) | ||
| 165 | self.Refresh() | ||
| 166 | |||
| 167 | def zoom_in(self): | ||
| 168 | x = self.scroll_start_us() | ||
| 169 | self.zoom *= 2 | ||
| 170 | self.__zoom(x) | ||
| 171 | |||
| 172 | def zoom_out(self): | ||
| 173 | x = self.scroll_start_us() | ||
| 174 | self.zoom /= 2 | ||
| 175 | self.__zoom(x) | ||
| 176 | |||
| 177 | |||
| 178 | def on_key_press(self, event): | ||
| 179 | key = event.GetRawKeyCode() | ||
| 180 | if key == ord("+"): | ||
| 181 | self.zoom_in() | ||
| 182 | return | ||
| 183 | if key == ord("-"): | ||
| 184 | self.zoom_out() | ||
| 185 | return | ||
| 186 | |||
| 187 | key = event.GetKeyCode() | ||
| 188 | (x, y) = self.scroll.GetViewStart() | ||
| 189 | if key == wx.WXK_RIGHT: | ||
| 190 | self.scroll.Scroll(x + 1, y) | ||
| 191 | elif key == wx.WXK_LEFT: | ||
| 192 | self.scroll.Scroll(x - 1, y) | ||
| 193 | elif key == wx.WXK_DOWN: | ||
| 194 | self.scroll.Scroll(x, y + 1) | ||
| 195 | elif key == wx.WXK_UP: | ||
| 196 | self.scroll.Scroll(x, y - 1) | ||
| 197 | 27 | ||
| 198 | 28 | ||
| 199 | threads = { 0 : "idle"} | 29 | threads = { 0 : "idle"} |
