From 830172cd03ce92819703f9be3b9ad190cbd96614 Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Mon, 5 Dec 2011 14:02:01 +0100 Subject: cesar/common/tools/traceviewer: fix annotations --- cesar/common/tools/traceviewer/annotate/cpu.py | 4 +- cesar/common/tools/traceviewer/trace_view.py | 56 ++++++++++++++++---------- 2 files changed, 36 insertions(+), 24 deletions(-) (limited to 'cesar/common') 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) -- cgit v1.2.3