aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorFrederic Weisbecker <fweisbec@gmail.com>2010-07-25 20:29:44 -0400
committerFrederic Weisbecker <fweisbec@gmail.com>2010-08-01 19:31:59 -0400
commitdf92b40848616596c50b3b9e6d6ce8252af606ee (patch)
treebf2b02ac9feb9478b32f9e195aa65afd3a632d30 /tools
parent699b6d922c7d07f0c1c9041b489e884b5dd5fee5 (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')
-rw-r--r--tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/SchedGui.py184
-rw-r--r--tools/perf/scripts/python/sched-migration.py180
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
11try:
12 import wx
13except ImportError:
14 raise ImportError, "You need to install the wxpython lib for this script"
15
16
17class 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
12try:
13 import wx
14except ImportError:
15 raise ImportError, "You need to install the wxpython lib for this script"
16
17import os 14import os
18import sys 15import sys
19 16
@@ -22,178 +19,11 @@ from UserList import UserList
22 19
23sys.path.append(os.environ['PERF_EXEC_PATH'] + \ 20sys.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')
22sys.path.append('scripts/python/Perf-Trace-Util/lib/Perf/Trace')
25 23
26from perf_trace_context import * 24from perf_trace_context import *
27from Core import * 25from Core import *
28 26from SchedGui import *
29class 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
199threads = { 0 : "idle"} 29threads = { 0 : "idle"}