blob: 4b2e8d26a424885baa2a7456db8fad06b17ac7ca [file] [log] [blame]
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
# Copyright 2019 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""This script is used to generate trace from build_packages eventlog.
Usage:
$ ./build_packages --withevents --board=${BOARD}
$ build_trace /mnt/host/source/src/build/events/${date}.json > trace.json
$ # load trace.json from chrome://tracing
"""
from __future__ import print_function
import argparse
import json
import sys
def get_name(event):
name = ''
def append(event, name, key, sep='/'):
if key in event:
if name != '':
name += sep
name += event[key]
return name
name = append(event, name, 'task_name')
name = append(event, name, 'category')
name = append(event, name, 'name')
name = append(event, name, 'version', '-')
return name
def main(argv):
parser = argparse.ArgumentParser()
parser.add_argument('eventlogfile')
args = parser.parse_args(argv)
with open(args.eventlogfile) as f:
events = [json.loads(x) for x in f]
events.sort(key=lambda event: -event['finish_time'])
threads_starttime = []
trace_events = []
for event in events:
name = get_name(event)
start_time = int(event['start_time'] * 1e6)
finish_time = int(event['finish_time'] * 1e6)
dur = finish_time - start_time
candidate = [x for x in list(enumerate(threads_starttime))
if finish_time <= x[1]]
candidate.sort(key=lambda x: x[0])
if len(candidate) == 0:
tid = len(threads_starttime)
threads_starttime.append(start_time)
else:
tid = candidate[0][0]
threads_starttime[tid] = start_time
trace_events.append({
'name': name,
'ph': 'X',
'ts': str(start_time),
'dur': str(dur),
'pid': '0',
'tid': str(tid),
})
json.dump(trace_events, sys.stdout)
if __name__ == '__main__':
main(sys.argv[1:])