blob: c4c37c254d6bbfe47d38e45864a4ec6102615f5d [file] [log] [blame]
Dan Willemsencae59bc2017-07-13 14:27:31 -07001// Copyright 2017 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package tracer
16
17import (
18 "bufio"
19 "os"
Dan Willemsenb82471a2018-05-17 16:37:09 -070020 "sort"
Dan Willemsencae59bc2017-07-13 14:27:31 -070021 "strconv"
22 "strings"
23)
24
Dan Willemsenb82471a2018-05-17 16:37:09 -070025type eventEntry struct {
26 Name string
27 Begin uint64
28 End uint64
29}
30
31func (t *tracerImpl) importEvents(entries []*eventEntry) {
32 sort.Slice(entries, func(i, j int) bool {
33 return entries[i].Begin < entries[j].Begin
34 })
35
36 cpus := []uint64{}
37 for _, entry := range entries {
38 tid := -1
39 for cpu, endTime := range cpus {
40 if endTime <= entry.Begin {
41 tid = cpu
42 cpus[cpu] = entry.End
43 break
44 }
45 }
46 if tid == -1 {
47 tid = len(cpus)
48 cpus = append(cpus, entry.End)
49 }
50
51 t.writeEvent(&viewerEvent{
52 Name: entry.Name,
53 Phase: "X",
54 Time: entry.Begin,
55 Dur: entry.End - entry.Begin,
56 Pid: 1,
57 Tid: uint64(tid),
58 })
59 }
60}
61
Dan Willemsencae59bc2017-07-13 14:27:31 -070062func (t *tracerImpl) ImportMicrofactoryLog(filename string) {
63 if _, err := os.Stat(filename); err != nil {
64 return
65 }
66
67 f, err := os.Open(filename)
68 if err != nil {
Dan Willemsen69b18ed2017-10-18 13:25:50 -070069 t.log.Verboseln("Error opening microfactory trace:", err)
Dan Willemsencae59bc2017-07-13 14:27:31 -070070 return
71 }
72 defer f.Close()
73
74 entries := []*eventEntry{}
75 begin := map[string][]uint64{}
76 s := bufio.NewScanner(f)
77 for s.Scan() {
78 fields := strings.SplitN(s.Text(), " ", 3)
79 if len(fields) != 3 {
80 t.log.Verboseln("Unknown line in microfactory trace:", s.Text())
81 continue
82 }
83 timestamp, err := strconv.ParseUint(fields[0], 10, 64)
84 if err != nil {
85 t.log.Verboseln("Failed to parse timestamp in microfactory trace:", err)
86 }
87
88 if fields[1] == "B" {
89 begin[fields[2]] = append(begin[fields[2]], timestamp)
90 } else if beginTimestamps, ok := begin[fields[2]]; ok {
91 entries = append(entries, &eventEntry{
92 Name: fields[2],
93 Begin: beginTimestamps[len(beginTimestamps)-1],
94 End: timestamp,
95 })
96 begin[fields[2]] = beginTimestamps[:len(beginTimestamps)-1]
97 }
98 }
99
100 t.importEvents(entries)
101}