Skip to contentSkip to conversation

Fixes for pybootchartgui

PATCH New Peter Kjellerstedt 1 participant 6 messages Jan 21, 2014

lore
Share & tools
lore
#0 lore raw

cover Fixes for pybootchartgui

This corrects and improves pybootchartgui. It starts by correcting two flaws introduced in my last update of pybootchartgui. It then makes a little simplification, followed up by improving the naming of split output files. Finally it introduces a new option (--full-time or -T) which makes sure the graph(s) always show the full time span regadless of which bars are currently shown (this is especially useful in combination with the -s option).

//Peter

The following changes since commit 1105b46d8f0174edbc315370835546e8ba5f7fd9:

poky.conf: Remove Debian Squeeze from SANITY_TESTED_DISTROS (2014-01-21 10:45:29 +0000)

are available in the git repository at:

git://git.yoctoproject.org/poky-contrib pkj/pybootchartgui2
http://git.yoctoproject.org/cgit.cgi/poky-contrib/log/?h=pkj/pybootchartgui2

Peter Kjellerstedt (5):
pybootchartgui: Make the -s option work again
pybootchartgui: Correct the legend
pybootchartgui: Simplify adding processes to the trace
pybootchartgui: Adopt the width of the index in split output files
pybootchartgui: Add option -T to allways use the full time

 scripts/pybootchartgui/pybootchartgui/draw.py    |  8 ++-
 scripts/pybootchartgui/pybootchartgui/main.py.in |  8 ++-
 scripts/pybootchartgui/pybootchartgui/parsing.py | 63 ++++++++++++------------
 3 files changed, 43 insertions(+), 36 deletions(-)
Signature · 1 line
1.8.4
#1 lore raw

PATCH 1/5 pybootchartgui: Make the -s option work again

[YOCTO #5588]

---
 scripts/pybootchartgui/pybootchartgui/parsing.py | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)
scripts/pybootchartgui/pybootchartgui/parsing.py +5 -4
index daee593..0600b51 100644
@@ -50,9 +50,10 @@ class Trace:
         self.parent_map = None
         self.mem_stats = None
 
-        parse_paths (writer, self, paths)
-        if not self.valid():
-            raise ParseError("empty state: '%s' does not contain a valid bootchart" % ", ".join(paths))
+        if len(paths):
+            parse_paths (writer, self, paths)
+            if not self.valid():
+                raise ParseError("empty state: '%s' does not contain a valid bootchart" % ", ".join(paths))
 
         return
 
@@ -713,7 +714,7 @@ def split_res(res, n):
         start = 0
         end = frag_size
         while start < end:
-            state = ParserState()
+            state = Trace(None, [], None)
             for i in range(start, end):
                 # Add these lines for reference
                 #state.processes[pn + ":" + task] = [start, end]
Signature · 1 line
1.8.4
#2 lore raw

PATCH 2/5 pybootchartgui: Correct the legend

In reply to Peter Kjellerstedt
---
 scripts/pybootchartgui/pybootchartgui/draw.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/pybootchartgui/pybootchartgui/draw.py +1 -1
index 299cced..4a2ffd7 100644
@@ -420,7 +420,7 @@ def render_processes_chart(ctx, options, trace, curr_y, w, h, sec_w):
 	draw_legend_box (ctx, "Install", \
 			 TASK_COLOR_INSTALL, off_x+240, curr_y + 45, leg_s)
 	draw_legend_box (ctx, "Populate Sysroot", \
-			 TASK_COLOR_SYSROOT, off_x+480, curr_y + 45, leg_s)
+			 TASK_COLOR_SYSROOT, off_x+360, curr_y + 45, leg_s)
 	draw_legend_box (ctx, "Package", \
 			 TASK_COLOR_PACKAGE, off_x+480, curr_y + 45, leg_s)
 	draw_legend_box (ctx, "Package Write",
Signature · 1 line
1.8.4
#4 lore raw

PATCH 4/5 pybootchartgui: Adopt the width of the index in split output files

In reply to Peter Kjellerstedt

Add minimum width zero-padding to the index used in split output files with -s and -o. I.e., if -s 200 is used, then the index will be zero-padded to three digits width.

---
 scripts/pybootchartgui/pybootchartgui/main.py.in | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
scripts/pybootchartgui/pybootchartgui/main.py.in +3 -1
index cc9c40b..e9d2c74 100644
@@ -155,11 +155,13 @@ def main(argv=None):
 			filename = _get_filename(options.output)
 			res_list = parsing.split_res(res, options.num)
 			n = 1
+			width = len(str(len(res_list)))
+			s = "_%%0%dd." % width
 			for r in res_list:
 				if len(res_list) == 1:
 					f = filename + "." + options.format
 				else:
-					f = filename + "_" + str(n) + "." + options.format
+					f = filename + s % n + options.format
 					n = n + 1
 				def render():
 					batch.render(writer, r, options, f)
Signature · 1 line
1.8.4
#5 lore raw

PATCH 5/5 pybootchartgui: Add option -T to allways use the full time

In reply to Peter Kjellerstedt

When --full-time (or -T) is used, the graph allways shows the full time regardless of which processes are currently shown. This is especially useful in combinationm with the -s flag when outputting to multiple files.

---
 scripts/pybootchartgui/pybootchartgui/draw.py    |  6 +++++-
 scripts/pybootchartgui/pybootchartgui/main.py.in |  4 +++-
 scripts/pybootchartgui/pybootchartgui/parsing.py | 15 ++++++++++++---
 3 files changed, 20 insertions(+), 5 deletions(-)
scripts/pybootchartgui/pybootchartgui/draw.py +5 -1
index 4a2ffd7..8c574be 100644
@@ -314,6 +314,10 @@ def extents(options, xscale, trace):
                         end = trace.processes[proc][1]
                 processes += 1
 
+	if trace.min is not None and trace.max is not None:
+		start = trace.min
+		end = trace.max
+
 	w = int ((end - start) * sec_w_base * xscale) + 2 * off_x
 	h = proc_h * processes + header_h + 2 * off_y
 
@@ -433,7 +437,7 @@ def render_processes_chart(ctx, options, trace, curr_y, w, h, sec_w):
 
 	y = curr_y+header_h
 
-        offset = min(trace.start.keys())
+        offset = trace.min or 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 \
scripts/pybootchartgui/pybootchartgui/main.py.in +3 -1
index e9d2c74..21bb0be 100644
@@ -65,6 +65,8 @@ def _mk_options_parser():
 #			       "To create a single annotation when any one of a set of processes is started, use commas to separate the names")
 #	parser.add_option("--annotate-file", dest="annotate_file", metavar="FILENAME", default=None,
 #			  help="filename to write annotation points to")
+	parser.add_option("-T", "--full-time", action="store_true", dest="full_time", default=False,
+			  help="display the full time regardless of which processes are currently shown")
 	return parser
 
 class Writer:
@@ -153,7 +155,7 @@ def main(argv=None):
 				finally:
 					f.close()
 			filename = _get_filename(options.output)
-			res_list = parsing.split_res(res, options.num)
+			res_list = parsing.split_res(res, options)
 			n = 1
 			width = len(str(len(res_list)))
 			s = "_%%0%dd." % width
scripts/pybootchartgui/pybootchartgui/parsing.py +12 -3
index 1cb4466..d423b9f 100644
@@ -38,6 +38,8 @@ class Trace:
         self.processes = {}
         self.start = {}
         self.end = {}
+        self.min = None
+        self.max = None
         self.headers = None
         self.disk_stats = None
         self.ps_stats = None
@@ -55,6 +57,10 @@ class Trace:
             if not self.valid():
                 raise ParseError("empty state: '%s' does not contain a valid bootchart" % ", ".join(paths))
 
+            if options.full_time:
+                self.min = min(self.start.keys())
+                self.max = max(self.end.keys())
+
         return
 
         # Turn that parsed information into something more useful
@@ -700,12 +706,12 @@ def parse_paths(writer, state, paths):
             state = parse_file(writer, state, path)
     return state
 
-def split_res(res, n):
+def split_res(res, options):
     """ Split the res into n pieces """
     res_list = []
-    if n > 1:
+    if options.num > 1:
         s_list = sorted(res.start.keys())
-        frag_size = len(s_list) / float(n)
+        frag_size = len(s_list) / float(options.num)
         # Need the top value
         if frag_size > int(frag_size):
             frag_size = int(frag_size + 1)
@@ -716,6 +722,9 @@ def split_res(res, n):
         end = frag_size
         while start < end:
             state = Trace(None, [], None)
+            if options.full_time:
+                state.min = min(res.start.keys())
+                state.max = max(res.end.keys())
             for i in range(start, end):
                 # Add this line for reference
                 #state.add_process(pn + ":" + task, start, end)
Signature · 1 line
1.8.4
#3 lore raw

PATCH 3/5 pybootchartgui: Simplify adding processes to the trace

In reply to Peter Kjellerstedt
---
 scripts/pybootchartgui/pybootchartgui/parsing.py | 39 +++++++++---------------
 1 file changed, 14 insertions(+), 25 deletions(-)
scripts/pybootchartgui/pybootchartgui/parsing.py +14 -25
index 0600b51..1cb4466 100644
@@ -96,6 +96,16 @@ class Trace:
         return self.headers != None and self.disk_stats != None and \
                self.ps_stats != None and self.cpu_stats != None
 
+    def add_process(self, process, start, end):
+        self.processes[process] = [start, end]
+        if start not in self.start:
+            self.start[start] = []
+        if process not in self.start[start]:
+            self.start[start].append(process)
+        if end not in self.end:
+            self.end[end] = []
+        if process not in self.end[end]:
+            self.end[end].append(process)
 
     def compile(self, writer):
 
@@ -645,16 +655,7 @@ def _do_parse(writer, state, filename, file):
         elif line.startswith("Ended:"):
             end = int(float(line.split()[-1]))
     if start and end:
-        k = pn + ":" + task
-        state.processes[pn + ":" + task] = [start, end]
-        if start not in state.start:
-            state.start[start] = []
-        if k not in state.start[start]:
-            state.start[start].append(pn + ":" + task)
-        if end not in state.end:
-            state.end[end] = []
-        if k not in state.end[end]:
-            state.end[end].append(pn + ":" + task)
+        state.add_process(pn + ":" + task, start, end)
     t2 = clock()
     writer.info("  %s seconds" % str(t2-t1))
     return state
@@ -716,22 +717,10 @@ def split_res(res, n):
         while start < end:
             state = Trace(None, [], None)
             for i in range(start, end):
-                # Add these lines for reference
-                #state.processes[pn + ":" + task] = [start, end]
-                #state.start[start] = pn + ":" + task
-                #state.end[end] = pn + ":" + task
+                # Add this line for reference
+                #state.add_process(pn + ":" + task, start, end)
                 for p in res.start[s_list[i]]:
-                    s = s_list[i]
-                    e = res.processes[p][1]
-                    state.processes[p] = [s, e]
-                    if s not in state.start:
-                        state.start[s] = []
-                    if p not in state.start[s]:
-                        state.start[s].append(p)
-                    if e not in state.end:
-                        state.end[e] = []
-                    if p not in state.end[e]:
-                        state.end[e].append(p)
+                    state.add_process(p, s_list[i], res.processes[p][1])
             start = end
             end = end + frag_size
             if end > len(s_list):
Signature · 1 line
1.8.4