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]