Source code for trappy.plotter.Utils
# Copyright 2015-2016 ARM Limited
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
"""Utils module has generic utils that will be used across
objects
"""
import collections
import warnings
from trappy.utils import listify
[docs]def normalize_list(val, lst):
"""Normalize a unitary list"""
if len(lst) != 1:
raise RuntimeError("Cannot Normalize a non-unitary list")
return lst * val
[docs]def decolonize(val):
"""Remove the colon at the end of the word
This will be used by the unique word of
template class to sanitize attr accesses
"""
return val.strip(":")
[docs]def get_trace_event_data(trace, execnames=None, pids=None):
"""Create a list of objects that can be consumed by EventPlot to plot
task residency like kernelshark
"""
if execnames:
execnames = listify(execnames)
if pids:
pids = listify(pids)
data = collections.defaultdict(list)
pmap = {}
data_frame = trace.sched_switch.data_frame
start_idx = data_frame.index.values[0]
end_idx = data_frame.index.values[-1]
procs = set()
for index, row in data_frame.iterrows():
prev_pid = row["prev_pid"]
next_pid = row["next_pid"]
next_comm = row["next_comm"]
if prev_pid in pmap:
name = pmap[prev_pid]
data[name][-1][1] = index
del pmap[prev_pid]
name = "{}-{}".format(next_comm, next_pid)
if next_pid in pmap:
# Corrupted trace probably due to dropped events. We
# don't know when the pid in pmap finished. We just
# ignore it and don't plot it
warn_str = "Corrupted trace (dropped events) for PID {} at time {}". \
format(next_pid, index)
warnings.warn(warn_str)
del pmap[next_pid]
del data[name][-1]
if next_pid != 0 and not next_comm.startswith("migration"):
if execnames and next_comm not in execnames:
continue
if pids and next_pid not in pids:
continue
data[name].append([index, end_idx, row["__cpu"]])
pmap[next_pid] = name
procs.add(name)
return data, procs, [start_idx, end_idx]