summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cesar/common/tools/traceviewer/annotate/cpu.py4
-rw-r--r--cesar/common/tools/traceviewer/trace_view.py56
2 files changed, 36 insertions, 24 deletions
diff --git a/cesar/common/tools/traceviewer/annotate/cpu.py b/cesar/common/tools/traceviewer/annotate/cpu.py
index 3e64981fd3..a50a4a371d 100644
--- a/cesar/common/tools/traceviewer/annotate/cpu.py
+++ b/cesar/common/tools/traceviewer/annotate/cpu.py
@@ -3,7 +3,7 @@ import re
def annotate (trace):
re_switch = re.compile (r'^switch .*to sp=(.*)')
- re_enter = re.compile (r'^(isr|dsr|phy)')
+ re_enter = re.compile (r'^(isr|dsr|phy) [^ ]*[0-9]')
re_exit = re.compile (r'^(?:isr|dsr|phy) exit')
stack = [ ]
for t in trace.trace:
@@ -19,7 +19,7 @@ def annotate (trace):
# Handle stack.
m_switch = re_switch.search (t.text)
if m_switch:
- stack = [ m_switch.group (1) ]
+ stack = [ 'thread' ]
elif re_exit.search (t.text):
if stack:
stack.pop ()
diff --git a/cesar/common/tools/traceviewer/trace_view.py b/cesar/common/tools/traceviewer/trace_view.py
index ffe530271e..b0e2230dee 100644
--- a/cesar/common/tools/traceviewer/trace_view.py
+++ b/cesar/common/tools/traceviewer/trace_view.py
@@ -170,42 +170,54 @@ class TraceView (gtk.DrawingArea):
line += 1
def draw_trace (self, trace, x, w, lyb, lyt):
- xend = min (long ((self.end - self.base) * self.zoom), x + w) - 1
+ xgend = long ((self.end - self.base) * self.zoom)
+ xend = min (xgend, x + w) - 1
if trace is self.highlighted:
self.window.draw_rectangle (self.highlight_gc, True, x, lyt,
xend - x, lyb - lyt)
self.window.draw_line (self.trace_gc, x, lyb, xend, lyb)
+ # Annotation function, executed late.
+ def draw_annotation (entry, d, dend):
+ if hasattr (entry, 'view_attr'):
+ gc = self.attr (entry.view_attr)
+ else:
+ gc = self.trace_gc
+ if hasattr (entry, 'view_text'):
+ text = self.create_pango_layout (entry.view_text)
+ size = text.get_pixel_size ()
+ if d + size[0] < dend:
+ self.window.draw_layout (gc, d + 1, lyb - size[1] + 4,
+ text)
# Draw a tick for each date corresponding to a trace event (avoid
# duplicate drawing).
- miin = long (x // self.zoom) + self.base
- max = long (((x + w) + self.zoom) // self.zoom) + self.base
- last = None
- for i in xrange (*trace.range (miin, max)):
+ date_min = long (x // self.zoom) + self.base
+ date_max = long (((x + w) + self.zoom) // self.zoom) + self.base
+ imin, imax = trace.range (date_min, date_max)
+ dlast = None
+ for i in xrange (max (0, imin - 1), imax):
d = long ((trace.trace[i].date - self.base) * self.zoom)
# Draw if not drawn yet.
- if d != last:
- # Get optional view attribute and text.
+ if d != dlast:
+ # Get optional view attribute.
if hasattr (trace.trace[i], 'view_attr'):
gc = self.attr (trace.trace[i].view_attr)
else:
gc = self.trace_gc
- if hasattr (trace.trace[i], 'view_text'):
- text = trace.trace[i].view_text
- text = self.create_pango_layout (text)
- else:
- text = None
# Draw tick.
self.window.draw_line (gc, d, lyt, d, lyb)
- # Draw text if there is room.
- if text is not None:
- if len (trace.trace) > i + 1:
- dnext = long ((trace.trace[i + 1].date - self.base)
- * self.zoom)
- else:
- dnext = None
- if dnext is None or d + text.get_pixel_size ()[0] < dnext:
- self.window.draw_layout (gc, d + 1, lyt - 1, text)
- last = d
+ # Draw previous text if there is room.
+ if dlast is not None:
+ draw_annotation (trace.trace[i - 1], dlast, d)
+ # Remember for next iteration.
+ dlast = d
+ # Draw last annotation.
+ if dlast is not None:
+ try:
+ next_entry = trace.trace[i + 1]
+ dend = long ((next_entry.date - self.base) * self.zoom)
+ except IndexError:
+ dend = xgend
+ draw_annotation (trace.trace[i], dlast, dend)
def zoom_fit (self, px):
self.zoom = float (px) / (self.end - self.base)