Patchwork [10/14] pybootchartgui: Make "Show more" show all processes

login
register
mail settings
Submitter Peter Kjellerstedt
Date Nov. 15, 2013, 5:08 p.m.
Message ID <d56c0aa2c2bb26aa779feed3dbad791462ecbe20.1384535211.git.pkj@axis.com>
Download mbox | patch
Permalink /patch/61809/
State New
Headers show

Comments

Peter Kjellerstedt - Nov. 15, 2013, 5:08 p.m.
While "Show more" is enabled, all processes are shown, regardless of
--mintime.

This also has the added benefit of making the first shown bar start at
its correct offset from the start time, rather than always starting at
0.

Signed-off-by: Peter Kjellerstedt <peter.kjellerstedt@axis.com>
---
 scripts/pybootchartgui/pybootchartgui/draw.py    | 19 ++++++++++++++++---
 scripts/pybootchartgui/pybootchartgui/gui.py     |  2 ++
 scripts/pybootchartgui/pybootchartgui/main.py.in |  2 +-
 scripts/pybootchartgui/pybootchartgui/parsing.py | 16 ++++++++--------
 4 files changed, 27 insertions(+), 12 deletions(-)

Patch

diff --git a/scripts/pybootchartgui/pybootchartgui/draw.py b/scripts/pybootchartgui/pybootchartgui/draw.py
index a22ac80..2aa348b 100644
--- a/scripts/pybootchartgui/pybootchartgui/draw.py
+++ b/scripts/pybootchartgui/pybootchartgui/draw.py
@@ -297,10 +297,20 @@  OPTIONS = None
 
 def extents(options, xscale, trace):
 	start = min(trace.start.keys())
-	end = max(trace.end.keys())
+	end = start
 
-	w = int ((end - start) * sec_w_base * xscale) + 2*off_x
-	h = proc_h * len(trace.processes) + header_h + 2 * off_y
+        processes = 0
+        for proc in trace.processes:
+                if not options.app_options.show_all and \
+                   trace.processes[proc][1] - trace.processes[proc][0] < options.app_options.mintime:
+                        continue
+
+                if trace.processes[proc][1] > end:
+                        end = trace.processes[proc][1]
+                processes += 1
+
+	w = int ((end - start) * sec_w_base * xscale) + 2 * off_x
+	h = proc_h * processes + header_h + 2 * off_y
 
 	return (w, h)
 
@@ -419,6 +429,9 @@  def render_processes_chart(ctx, options, trace, curr_y, w, h, sec_w):
         offset = min(trace.start.keys())
         for s in sorted(trace.start.keys()):
             for val in sorted(trace.start[s]):
+                if not options.app_options.show_all and \
+                   trace.processes[val][1] - s < options.app_options.mintime:
+                    continue
                 task = val.split(":")[1]
                 #print val
                 #print trace.processes[val][1]
diff --git a/scripts/pybootchartgui/pybootchartgui/gui.py b/scripts/pybootchartgui/pybootchartgui/gui.py
index 1120701..7fedd23 100644
--- a/scripts/pybootchartgui/pybootchartgui/gui.py
+++ b/scripts/pybootchartgui/pybootchartgui/gui.py
@@ -121,6 +121,8 @@  class PyBootchartWidget(gtk.DrawingArea):
 
     def show_toggled(self, button):
         self.options.app_options.show_all = button.get_property ('active')
+        self.chart_width, self.chart_height = draw.extents(self.options, self.xscale, self.trace)
+        self._set_scroll_adjustments(self.hadj, self.vadj)
         self.queue_draw()
 
     POS_INCREMENT = 100
diff --git a/scripts/pybootchartgui/pybootchartgui/main.py.in b/scripts/pybootchartgui/pybootchartgui/main.py.in
index 3927186..1d70271 100644
--- a/scripts/pybootchartgui/pybootchartgui/main.py.in
+++ b/scripts/pybootchartgui/pybootchartgui/main.py.in
@@ -55,7 +55,7 @@  def _mk_options_parser():
 #	parser.add_option("--show-pid", action="store_true", dest="show_pid", default=False,
 #			  help="show process ids in the bootchart as 'processname [pid]'")
 	parser.add_option("--show-all", action="store_true", dest="show_all", default=False,
-			  help="show all process information in the bootchart as '/process/path/exe [pid] [args]'")
+			  help="show all processes in the chart")
 #	parser.add_option("--crop-after", dest="crop_after", metavar="PROCESS", default=None,
 #			  help="crop chart when idle after PROCESS is started")
 #	parser.add_option("--annotate", action="append", dest="annotate", metavar="PROCESS", default=None,
diff --git a/scripts/pybootchartgui/pybootchartgui/parsing.py b/scripts/pybootchartgui/pybootchartgui/parsing.py
index ed61825..daee593 100644
--- a/scripts/pybootchartgui/pybootchartgui/parsing.py
+++ b/scripts/pybootchartgui/pybootchartgui/parsing.py
@@ -50,7 +50,7 @@  class Trace:
         self.parent_map = None
         self.mem_stats = None
 
-        parse_paths (writer, self, paths, options.mintime)
+        parse_paths (writer, self, paths)
         if not self.valid():
             raise ParseError("empty state: '%s' does not contain a valid bootchart" % ", ".join(paths))
 
@@ -630,7 +630,7 @@  def get_num_cpus(headers):
         return 1
     return max (int(mat.group(1)), 1)
 
-def _do_parse(writer, state, filename, file, mintime):
+def _do_parse(writer, state, filename, file):
     writer.info("parsing '%s'" % filename)
     t1 = clock()
     paths = filename.split("/")
@@ -643,7 +643,7 @@  def _do_parse(writer, state, filename, file, mintime):
             start = int(float(line.split()[-1]))
         elif line.startswith("Ended:"):
             end = int(float(line.split()[-1]))
-    if start and end and (end - start) >= mintime:
+    if start and end:
         k = pn + ":" + task
         state.processes[pn + ":" + task] = [start, end]
         if start not in state.start:
@@ -658,14 +658,14 @@  def _do_parse(writer, state, filename, file, mintime):
     writer.info("  %s seconds" % str(t2-t1))
     return state
 
-def parse_file(writer, state, filename, mintime):
+def parse_file(writer, state, filename):
     if state.filename is None:
         state.filename = filename
     basename = os.path.basename(filename)
     with open(filename, "rb") as file:
-        return _do_parse(writer, state, filename, file, mintime)
+        return _do_parse(writer, state, filename, file)
 
-def parse_paths(writer, state, paths, mintime):
+def parse_paths(writer, state, paths):
     for path in paths:
         if state.filename is None:
             state.filename = path
@@ -676,7 +676,7 @@  def parse_paths(writer, state, paths, mintime):
         #state.filename = path
         if os.path.isdir(path):
             files = sorted([os.path.join(path, f) for f in os.listdir(path)])
-            state = parse_paths(writer, state, files, mintime)
+            state = parse_paths(writer, state, files)
         elif extension in [".tar", ".tgz", ".gz"]:
             if extension == ".gz":
                 root, extension = os.path.splitext(root)
@@ -695,7 +695,7 @@  def parse_paths(writer, state, paths, mintime):
                 if tf != None:
                     tf.close()
         else:
-            state = parse_file(writer, state, path, mintime)
+            state = parse_file(writer, state, path)
     return state
 
 def split_res(res, n):