diff options
author | Darren Hart <dvhltc@us.ibm.com> | 2009-12-28 20:30:42 -0500 |
---|---|---|
committer | Darren Hart <dvhltc@us.ibm.com> | 2009-12-30 12:22:40 -0500 |
commit | 6d1b5fd541ec3358c39f08f80d316fee8346a60d (patch) | |
tree | 1dd545432f10282e19ba98349a1b1a422df05bde | |
parent | c52d8d059d46dcd359b11c9137962ac0b7679d52 (diff) |
trace-cmd: Add Python GTK Event Viewer example
Signed-off-by: Darren Hart <dvhltc@us.ibm.com>
-rwxr-xr-x | event-viewer.py | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/event-viewer.py b/event-viewer.py new file mode 100755 index 0000000..bbafff0 --- /dev/null +++ b/event-viewer.py | |||
@@ -0,0 +1,129 @@ | |||
1 | #!/usr/bin/env python | ||
2 | |||
3 | from gobject import * | ||
4 | import gtk | ||
5 | from tracecmd import * | ||
6 | |||
7 | app = None | ||
8 | data_func_cnt = 0 | ||
9 | |||
10 | class EventStore(gtk.ListStore): | ||
11 | def __init__(self, trace): | ||
12 | gtk.ListStore.__init__(self, gobject.TYPE_PYOBJECT) | ||
13 | self.trace = trace | ||
14 | for cpu in range(0, trace.cpus): | ||
15 | ev = trace.read_event(cpu) | ||
16 | while ev: | ||
17 | # store the record offset into the trace file | ||
18 | self.append([record_offset_get(ev.rec)]) | ||
19 | ev = trace.read_event(cpu) | ||
20 | print "Loaded %d events across %d cpus" % (len(self), trace.cpus) | ||
21 | |||
22 | def get_event(self, iter): | ||
23 | offset = self.get_value(iter, 0) | ||
24 | return self.trace.read_event_at(offset) | ||
25 | |||
26 | |||
27 | class EventView(gtk.TreeView): | ||
28 | def __init__(self, model): | ||
29 | gtk.TreeView.__init__(self, model) | ||
30 | |||
31 | ts_col = gtk.TreeViewColumn("Time (s)") | ||
32 | ts_cell = gtk.CellRendererText() | ||
33 | ts_col.pack_start(ts_cell, False) | ||
34 | ts_col.set_cell_data_func(ts_cell, self.data_func, "ts") | ||
35 | self.append_column(ts_col) | ||
36 | |||
37 | cpu_col = gtk.TreeViewColumn("CPU") | ||
38 | cpu_cell = gtk.CellRendererText() | ||
39 | cpu_col.pack_start(cpu_cell, False) | ||
40 | cpu_col.set_cell_data_func(cpu_cell, self.data_func, "cpu") | ||
41 | self.append_column(cpu_col) | ||
42 | |||
43 | event_col = gtk.TreeViewColumn("Event") | ||
44 | event_cell = gtk.CellRendererText() | ||
45 | event_col.pack_start(event_cell, False) | ||
46 | event_col.set_cell_data_func(event_cell, self.data_func, "event") | ||
47 | self.append_column(event_col) | ||
48 | |||
49 | pid_col = gtk.TreeViewColumn("PID") | ||
50 | pid_cell = gtk.CellRendererText() | ||
51 | pid_col.pack_start(pid_cell, False) | ||
52 | pid_col.set_cell_data_func(pid_cell, self.data_func, "pid") | ||
53 | self.append_column(pid_col) | ||
54 | |||
55 | comm_col = gtk.TreeViewColumn("Comm") | ||
56 | comm_cell = gtk.CellRendererText() | ||
57 | comm_col.pack_start(comm_cell, False) | ||
58 | comm_col.set_cell_data_func(comm_cell, self.data_func, "comm") | ||
59 | self.append_column(comm_col) | ||
60 | |||
61 | def data_func(self, col, cell, model, iter, data): | ||
62 | global app, data_func_cnt | ||
63 | data_func_cnt = data_func_cnt + 1 | ||
64 | if app: | ||
65 | app.inc_data_func() | ||
66 | |||
67 | ev = model.get_event(iter) | ||
68 | if not ev: | ||
69 | return False | ||
70 | if data == "ts": | ||
71 | cell.set_property("markup", "%d.%d" % (ev.ts/1000000000, | ||
72 | ev.ts%1000000000)) | ||
73 | return True | ||
74 | if data == "cpu": | ||
75 | cell.set_property("markup", ev.cpu) | ||
76 | return True | ||
77 | if data == "event": | ||
78 | cell.set_property("markup", ev.name) | ||
79 | return True | ||
80 | if data == "pid": | ||
81 | cell.set_property("markup", ev.pid) | ||
82 | return True | ||
83 | if data == "comm": | ||
84 | cell.set_property("markup", ev.comm) | ||
85 | return True | ||
86 | |||
87 | return False | ||
88 | |||
89 | |||
90 | class EventViewerApp(gtk.Window): | ||
91 | def __init__(self, trace): | ||
92 | gtk.Window.__init__(self) | ||
93 | |||
94 | self.set_size_request(650, 400) | ||
95 | self.set_position(gtk.WIN_POS_CENTER) | ||
96 | |||
97 | self.connect("destroy", gtk.main_quit) | ||
98 | self.set_title("Event Viewer") | ||
99 | |||
100 | |||
101 | es = EventStore(trace) | ||
102 | view = EventView(es) | ||
103 | |||
104 | sw = gtk.ScrolledWindow() | ||
105 | sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_ALWAYS) | ||
106 | sw.add(view) | ||
107 | |||
108 | # track how often the treeview data_func is called | ||
109 | self.data_func_label = gtk.Label("0") | ||
110 | hbox = gtk.HBox() | ||
111 | hbox.pack_start(gtk.Label("Data Func Calls:"), False, False) | ||
112 | hbox.pack_start(self.data_func_label, False, False) | ||
113 | |||
114 | vbox = gtk.VBox() | ||
115 | vbox.pack_start(hbox, False) | ||
116 | vbox.pack_end(sw) | ||
117 | |||
118 | self.add(vbox) | ||
119 | self.show_all() | ||
120 | |||
121 | def inc_data_func(self): | ||
122 | global data_func_cnt | ||
123 | self.data_func_label.set_text(str(data_func_cnt)) | ||
124 | |||
125 | |||
126 | if __name__ == "__main__": | ||
127 | trace = Trace("trace.dat") | ||
128 | app = EventViewerApp(trace) | ||
129 | gtk.main() | ||