summaryrefslogtreecommitdiffstats
path: root/scripts/pybootchartgui/pybootchartgui/parsing.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/pybootchartgui/pybootchartgui/parsing.py')
-rw-r--r--scripts/pybootchartgui/pybootchartgui/parsing.py47
1 files changed, 26 insertions, 21 deletions
diff --git a/scripts/pybootchartgui/pybootchartgui/parsing.py b/scripts/pybootchartgui/pybootchartgui/parsing.py
index a350a3eb08..11a082941c 100644
--- a/scripts/pybootchartgui/pybootchartgui/parsing.py
+++ b/scripts/pybootchartgui/pybootchartgui/parsing.py
@@ -160,34 +160,39 @@ def get_num_cpus(headers):
160 160
161class ParserState: 161class ParserState:
162 def __init__(self): 162 def __init__(self):
163 self.headers = None 163 self.processes = {}
164 self.disk_stats = None 164 self.start = {}
165 self.ps_stats = None 165 self.end = {}
166 self.cpu_stats = None
167 166
168 def valid(self): 167 def valid(self):
169 return self.headers != None and self.disk_stats != None and self.ps_stats != None and self.cpu_stats != None 168 return len(self.processes) != 0
170 169
171 170
172_relevant_files = set(["header", "proc_diskstats.log", "proc_ps.log", "proc_stat.log"]) 171_relevant_files = set(["header", "proc_diskstats.log", "proc_ps.log", "proc_stat.log"])
173 172
174def _do_parse(state, name, file): 173def _do_parse(state, filename, file):
175 if name == "header": 174 #print filename
176 state.headers = _parse_headers(file) 175 #writer.status("parsing '%s'" % filename)
177 elif name == "proc_diskstats.log": 176 paths = filename.split("/")
178 state.disk_stats = _parse_proc_disk_stat_log(file, get_num_cpus(state.headers)) 177 task = paths[-1]
179 elif name == "proc_ps.log": 178 pn = paths[-2]
180 state.ps_stats = _parse_proc_ps_log(file) 179 start = None
181 elif name == "proc_stat.log": 180 end = None
182 state.cpu_stats = _parse_proc_stat_log(file) 181 for line in file:
182 if line.startswith("Started:"):
183 start = int(float(line.split()[-1]))
184 elif line.startswith("Ended:"):
185 end = int(float(line.split()[-1]))
186 if start and end and (end - start) > 8:
187 state.processes[pn + ":" + task] = [start, end]
188 state.start[start] = pn + ":" + task
189 state.end[end] = pn + ":" + task
183 return state 190 return state
184 191
185def parse_file(state, filename): 192def parse_file(state, filename):
186 basename = os.path.basename(filename) 193 basename = os.path.basename(filename)
187 if not(basename in _relevant_files):
188 return state
189 with open(filename, "rb") as file: 194 with open(filename, "rb") as file:
190 return _do_parse(state, basename, file) 195 return _do_parse(state, filename, file)
191 196
192def parse_paths(state, paths): 197def parse_paths(state, paths):
193 for path in paths: 198 for path in paths:
@@ -196,7 +201,7 @@ def parse_paths(state, paths):
196 print "warning: path '%s' does not exist, ignoring." % path 201 print "warning: path '%s' does not exist, ignoring." % path
197 continue 202 continue
198 if os.path.isdir(path): 203 if os.path.isdir(path):
199 files = [ f for f in [os.path.join(path, f) for f in os.listdir(path)] if os.path.isfile(f) ] 204 files = [ f for f in [os.path.join(path, f) for f in os.listdir(path)] ]
200 files.sort() 205 files.sort()
201 state = parse_paths(state, files) 206 state = parse_paths(state, files)
202 elif extension in [".tar", ".tgz", ".tar.gz"]: 207 elif extension in [".tar", ".tgz", ".tar.gz"]:
@@ -218,6 +223,6 @@ def parse(paths, prune):
218 state = parse_paths(ParserState(), paths) 223 state = parse_paths(ParserState(), paths)
219 if not state.valid(): 224 if not state.valid():
220 raise ParseError("empty state: '%s' does not contain a valid bootchart" % ", ".join(paths)) 225 raise ParseError("empty state: '%s' does not contain a valid bootchart" % ", ".join(paths))
221 monitored_app = state.headers.get("profile.process") 226 #monitored_app = state.headers.get("profile.process")
222 proc_tree = ProcessTree(state.ps_stats, monitored_app, prune) 227 #proc_tree = ProcessTree(state.ps_stats, monitored_app, prune)
223 return (state.headers, state.cpu_stats, state.disk_stats, proc_tree) 228 return state