1 # Core.py - Python extension for perf script, core functions
3 # Copyright (C) 2010 by Tom Zanussi <tzanussi@gmail.com>
5 # This software may be distributed under the terms of the GNU General
6 # Public License ("GPL") version 2 as published by the Free Software
9 from collections import defaultdict
12 return defaultdict(autodict)
14 flag_fields = autodict()
15 symbolic_fields = autodict()
17 def define_flag_field(event_name, field_name, delim):
18 flag_fields[event_name][field_name]['delim'] = delim
20 def define_flag_value(event_name, field_name, value, field_str):
21 flag_fields[event_name][field_name]['values'][value] = field_str
23 def define_symbolic_field(event_name, field_name):
24 # nothing to do, really
27 def define_symbolic_value(event_name, field_name, value, field_str):
28 symbolic_fields[event_name][field_name]['values'][value] = field_str
30 def flag_str(event_name, field_name, value):
33 if flag_fields[event_name][field_name]:
35 for idx in sorted(flag_fields[event_name][field_name]['values']):
36 if not value and not idx:
37 string += flag_fields[event_name][field_name]['values'][idx]
39 if idx and (value & idx) == idx:
40 if print_delim and flag_fields[event_name][field_name]['delim']:
41 string += " " + flag_fields[event_name][field_name]['delim'] + " "
42 string += flag_fields[event_name][field_name]['values'][idx]
48 def symbol_str(event_name, field_name, value):
51 if symbolic_fields[event_name][field_name]:
52 for idx in sorted(symbolic_fields[event_name][field_name]['values']):
53 if not value and not idx:
54 string = symbolic_fields[event_name][field_name]['values'][idx]
57 string = symbolic_fields[event_name][field_name]['values'][idx]
62 trace_flags = { 0x00: "NONE", \
64 0x02: "IRQS_NOSUPPORT", \
65 0x04: "NEED_RESCHED", \
69 def trace_flag_str(value):
73 for idx in trace_flags:
74 if not value and not idx:
78 if idx and (value & idx) == idx:
81 string += trace_flags[idx]
96 if state not in states:
103 def __init__(self, common_cpu, common_secs, common_nsecs,
104 common_pid, common_comm, common_callchain):
105 self.cpu = common_cpu
106 self.secs = common_secs
107 self.nsecs = common_nsecs
108 self.pid = common_pid
109 self.comm = common_comm
110 self.callchain = common_callchain
113 return (self.secs * (10 ** 9)) + self.nsecs
116 return "%d.%d" % (self.secs, int(self.nsecs / 1000))