blob: 3b37e0c0484ab29ba83274d7332b6f97d107556f [file] [log] [blame]
Lalit Magantidfe69ca2018-10-30 12:18:23 +00001#!/usr/bin/python
2# Copyright (C) 2018 The Android Open Source Project
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15
16import argparse
17
18from google.protobuf import descriptor, descriptor_pb2, message_factory, reflection
19from google.protobuf.pyext import _message
20
21
22class Trace(object):
23 def __init__(self, trace):
24 self.trace = trace
25 self.proc_map = {}
26 self.proc_map[0] = "idle_thread"
27
28 def add_ftrace_packet(self, cpu):
29 self.packet = self.trace.packet.add()
30 self.packet.ftrace_events.cpu = cpu
31
32 def add_sched(self, ts, prev_pid, next_pid):
33 ftrace = self.packet.ftrace_events.event.add()
34 ftrace.timestamp = ts
35
36 ss = ftrace.sched_switch
37 ss.prev_comm = self.proc_map[prev_pid]
38 ss.prev_pid = prev_pid
39 ss.next_pid = next_pid
40 ss.next_comm = self.proc_map[next_pid]
41
42 def add_cpufreq(self, ts, freq, cpu):
43 ftrace = self.packet.ftrace_events.event.add()
44 ftrace.timestamp = ts
45
46 cpufreq = ftrace.cpu_frequency
47 cpufreq.state = freq
48 cpufreq.cpu_id = cpu
49
50 def add_process_tree_packet(self):
51 self.packet = self.trace.packet.add()
52
53 def add_process(self, pid, ppid, cmdline):
54 process = self.packet.process_tree.processes.add()
55 process.pid = pid
56 process.ppid = ppid
57 process.cmdline.append(cmdline)
58
59 self.proc_map[pid] = cmdline
60
61 def add_thread(self, tid, tgid, cmdline):
62 thread = self.packet.process_tree.threads.add()
63 thread.tid = tid
64 thread.tgid = tgid
65
66 self.proc_map[tid] = cmdline
67
68
69def create_trace():
70 parser = argparse.ArgumentParser()
71 parser.add_argument(
72 'trace_descriptor', type=str, help='location of trace descriptor')
73 args = parser.parse_args()
74
75 with open(args.trace_descriptor, "rb") as t:
76 fileContent = t.read()
77
78 file_desc_set_pb2 = descriptor_pb2.FileDescriptorSet()
79 file_desc_set_pb2.MergeFromString(fileContent)
80
81 desc_by_path = {}
82 for f_desc_pb2 in file_desc_set_pb2.file:
83 f_desc_pb2_encode = f_desc_pb2.SerializeToString()
84 f_desc = descriptor.FileDescriptor(
85 name=f_desc_pb2.name,
86 package=f_desc_pb2.package,
87 serialized_pb=f_desc_pb2_encode)
88
89 for desc in f_desc.message_types_by_name.values():
90 desc_by_path[desc.full_name] = desc
91
92 trace = message_factory.MessageFactory().GetPrototype(
93 desc_by_path["perfetto.protos.Trace"])()
94 return Trace(trace)