summaryrefslogtreecommitdiff
path: root/misc/summarize-trace-files
blob: 3c65f052d2590b9b021474fb4c141022e3ee9b92 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#!/usr/bin/env python3

import json
import sys

trace = json.load(sys.stdin)

events = trace["traceEvents"]
slot_events = []

events.sort(key=lambda event: event["ts"])

jobs = int(sys.argv[1])

pids = {}
busy = [None] * jobs


def find_slot(pid):
    if pid in pids:
        return pids[pid]
    for slot in range(jobs):
        if not busy[slot]:
            busy[slot] = pid
            pids[pid] = slot
            return slot
    return None


def end_slot(pid):
    for slot in range(jobs):
        if busy[slot] == pid:
            busy[slot] = None
            del pids[pid]
            return slot
    return slot


name = {}
slot = -1
for event in events:
    cat = event["cat"]
    pid = event["pid"]
    phase = event["ph"]
    args = event["args"]

    if phase == "M" and event["name"] == "thread_name":
        name[pid] = args["name"]
    if cat != "program":
        continue

    if phase == "B" or phase == "S":
        slot = find_slot(pid)
    elif phase == "E" or phase == "F":
        slot = end_slot(pid)
    elif phase == "M":
        pass
    else:
        continue

    event["pid"] = slot
    event["tid"] = pid

    slot_events.append(event)

slot_events.sort(key=lambda event: event["tid"])

for event in slot_events:
    if event["cat"] == "program":
        event["cat"] = "ccache"
        if event["tid"] in name:
            event["name"] = name[event["tid"]]
    elif event["tid"] in name:
        event["name"] = event["name"] + ":" + name[event["tid"]]
    del event["tid"]
    if event["ph"] == "S":
        event["ph"] = "B"
    elif event["ph"] == "F":
        event["ph"] = "E"

for slot in range(jobs):
    slot_events.append(
        {
            "cat": "",
            "pid": slot,
            "tid": 0,
            "ph": "M",
            "name": "process_name",
            "args": {"name": "Job %d" % slot},
        }
    )

json.dump({"traceEvents": slot_events}, sys.stdout, indent=4)