Home | History | Annotate | Download | only in tracer
      1 // 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 
     15 package tracer
     16 
     17 import (
     18 	"bufio"
     19 	"os"
     20 	"sort"
     21 	"strconv"
     22 	"strings"
     23 )
     24 
     25 type eventEntry struct {
     26 	Name  string
     27 	Begin uint64
     28 	End   uint64
     29 }
     30 
     31 func (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 
     62 func (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 {
     69 		t.log.Verboseln("Error opening microfactory trace:", err)
     70 		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 }
    102