Nan Zhang | 17f2767 | 2018-12-12 16:01:49 -0800 | [diff] [blame] | 1 | // Copyright 2018 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 metrics |
| 16 | |
| 17 | import ( |
| 18 | "time" |
| 19 | |
| 20 | "android/soong/ui/metrics/metrics_proto" |
| 21 | "android/soong/ui/tracer" |
Patrice Arruda | 958b89c | 2020-07-13 18:21:14 +0000 | [diff] [blame] | 22 | "github.com/golang/protobuf/proto" |
Nan Zhang | 17f2767 | 2018-12-12 16:01:49 -0800 | [diff] [blame] | 23 | ) |
| 24 | |
Patrice Arruda | 958b89c | 2020-07-13 18:21:14 +0000 | [diff] [blame] | 25 | // for testing purpose only |
| 26 | var _now = now |
| 27 | |
Patrice Arruda | 457c5d3 | 2020-10-19 11:20:21 -0700 | [diff] [blame^] | 28 | type event struct { |
Nan Zhang | 17f2767 | 2018-12-12 16:01:49 -0800 | [diff] [blame] | 29 | desc string |
| 30 | name string |
| 31 | |
Patrice Arruda | 958b89c | 2020-07-13 18:21:14 +0000 | [diff] [blame] | 32 | // the time that the event started to occur. |
| 33 | start time.Time |
Nan Zhang | 17f2767 | 2018-12-12 16:01:49 -0800 | [diff] [blame] | 34 | } |
| 35 | |
Patrice Arruda | 457c5d3 | 2020-10-19 11:20:21 -0700 | [diff] [blame^] | 36 | type EventTracer interface { |
Nan Zhang | 17f2767 | 2018-12-12 16:01:49 -0800 | [diff] [blame] | 37 | Begin(name, desc string, thread tracer.Thread) |
Patrice Arruda | 0cc5b21 | 2019-06-14 15:27:46 -0700 | [diff] [blame] | 38 | End(thread tracer.Thread) soong_metrics_proto.PerfInfo |
Nan Zhang | 17f2767 | 2018-12-12 16:01:49 -0800 | [diff] [blame] | 39 | } |
| 40 | |
Patrice Arruda | 457c5d3 | 2020-10-19 11:20:21 -0700 | [diff] [blame^] | 41 | type eventTracerImpl struct { |
| 42 | activeEvents []event |
Nan Zhang | 17f2767 | 2018-12-12 16:01:49 -0800 | [diff] [blame] | 43 | } |
| 44 | |
Patrice Arruda | 457c5d3 | 2020-10-19 11:20:21 -0700 | [diff] [blame^] | 45 | var _ EventTracer = &eventTracerImpl{} |
Nan Zhang | 17f2767 | 2018-12-12 16:01:49 -0800 | [diff] [blame] | 46 | |
Patrice Arruda | 958b89c | 2020-07-13 18:21:14 +0000 | [diff] [blame] | 47 | func now() time.Time { |
| 48 | return time.Now() |
Nan Zhang | 17f2767 | 2018-12-12 16:01:49 -0800 | [diff] [blame] | 49 | } |
| 50 | |
Patrice Arruda | 457c5d3 | 2020-10-19 11:20:21 -0700 | [diff] [blame^] | 51 | func (t *eventTracerImpl) Begin(name, desc string, _ tracer.Thread) { |
| 52 | t.activeEvents = append(t.activeEvents, event{name: name, desc: desc, start: _now()}) |
Nan Zhang | 17f2767 | 2018-12-12 16:01:49 -0800 | [diff] [blame] | 53 | } |
| 54 | |
Patrice Arruda | 457c5d3 | 2020-10-19 11:20:21 -0700 | [diff] [blame^] | 55 | func (t *eventTracerImpl) End(tracer.Thread) soong_metrics_proto.PerfInfo { |
Nan Zhang | 17f2767 | 2018-12-12 16:01:49 -0800 | [diff] [blame] | 56 | if len(t.activeEvents) < 1 { |
| 57 | panic("Internal error: No pending events for endAt to end!") |
| 58 | } |
| 59 | lastEvent := t.activeEvents[len(t.activeEvents)-1] |
| 60 | t.activeEvents = t.activeEvents[:len(t.activeEvents)-1] |
Patrice Arruda | 958b89c | 2020-07-13 18:21:14 +0000 | [diff] [blame] | 61 | realTime := uint64(_now().Sub(lastEvent.start).Nanoseconds()) |
Nan Zhang | 17f2767 | 2018-12-12 16:01:49 -0800 | [diff] [blame] | 62 | |
Patrice Arruda | 0cc5b21 | 2019-06-14 15:27:46 -0700 | [diff] [blame] | 63 | return soong_metrics_proto.PerfInfo{ |
Patrice Arruda | 958b89c | 2020-07-13 18:21:14 +0000 | [diff] [blame] | 64 | Desc: proto.String(lastEvent.desc), |
| 65 | Name: proto.String(lastEvent.name), |
| 66 | StartTime: proto.Uint64(uint64(lastEvent.start.UnixNano())), |
| 67 | RealTime: proto.Uint64(realTime), |
| 68 | } |
Nan Zhang | 17f2767 | 2018-12-12 16:01:49 -0800 | [diff] [blame] | 69 | } |