Bump to ccache 4.4
[platform/upstream/ccache.git] / misc / summarize-trace-files
1 #!/usr/bin/env python3
2
3 import json
4 import sys
5
6 trace = json.load(sys.stdin)
7
8 events = trace["traceEvents"]
9 slot_events = []
10
11 events.sort(key=lambda event: event["ts"])
12
13 jobs = int(sys.argv[1])
14
15 pids = {}
16 busy = [None] * jobs
17
18
19 def find_slot(pid):
20     if pid in pids:
21         return pids[pid]
22     for slot in range(jobs):
23         if not busy[slot]:
24             busy[slot] = pid
25             pids[pid] = slot
26             return slot
27     return None
28
29
30 def end_slot(pid):
31     for slot in range(jobs):
32         if busy[slot] == pid:
33             busy[slot] = None
34             del pids[pid]
35             return slot
36     return slot
37
38
39 name = {}
40 slot = -1
41 for event in events:
42     cat = event["cat"]
43     pid = event["pid"]
44     phase = event["ph"]
45     args = event["args"]
46
47     if phase == "M" and event["name"] == "thread_name":
48         name[pid] = args["name"]
49     if cat != "program":
50         continue
51
52     if phase == "B" or phase == "S":
53         slot = find_slot(pid)
54     elif phase == "E" or phase == "F":
55         slot = end_slot(pid)
56     elif phase == "M":
57         pass
58     else:
59         continue
60
61     event["pid"] = slot
62     event["tid"] = pid
63
64     slot_events.append(event)
65
66 slot_events.sort(key=lambda event: event["tid"])
67
68 for event in slot_events:
69     if event["cat"] == "program":
70         event["cat"] = "ccache"
71         if event["tid"] in name:
72             event["name"] = name[event["tid"]]
73     elif event["tid"] in name:
74         event["name"] = event["name"] + ":" + name[event["tid"]]
75     del event["tid"]
76     if event["ph"] == "S":
77         event["ph"] = "B"
78     elif event["ph"] == "F":
79         event["ph"] = "E"
80
81 for slot in range(jobs):
82     slot_events.append(
83         {
84             "cat": "",
85             "pid": slot,
86             "tid": 0,
87             "ph": "M",
88             "name": "process_name",
89             "args": {"name": "Job %d" % slot},
90         }
91     )
92
93 json.dump({"traceEvents": slot_events}, sys.stdout, indent=4)