// Copyright 2023 Google Inc. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package status import ( "time" "android/soong/ui/logger" ) // Create a new CriticalPathLogger. if criticalPath is nil, it creates a new criticalPath, // if not, it uses that.(its purpose is using a critical path outside logger) func NewCriticalPathLogger(log logger.Logger, criticalPath *CriticalPath) StatusOutput { if criticalPath == nil { criticalPath = NewCriticalPath() } return &criticalPathLogger{ log: log, criticalPath: criticalPath, } } type criticalPathLogger struct { log logger.Logger criticalPath *CriticalPath } func (cp *criticalPathLogger) StartAction(action *Action, counts Counts) { cp.criticalPath.StartAction(action) } func (cp *criticalPathLogger) FinishAction(result ActionResult, counts Counts) { cp.criticalPath.FinishAction(result.Action) } func (cp *criticalPathLogger) Flush() { criticalPath, elapsedTime, criticalTime := cp.criticalPath.criticalPath() if len(criticalPath) > 0 { cp.log.Verbosef("critical path took %s", criticalTime.String()) if !cp.criticalPath.start.IsZero() { cp.log.Verbosef("elapsed time %s", elapsedTime.String()) if elapsedTime > 0 { cp.log.Verbosef("perfect parallelism ratio %d%%", int(float64(criticalTime)/float64(elapsedTime)*100)) } } cp.log.Verbose("critical path:") for i := len(criticalPath) - 1; i >= 0; i-- { duration := criticalPath[i].duration duration = duration.Round(time.Second) seconds := int(duration.Seconds()) cp.log.Verbosef(" %2d:%02d %s", seconds/60, seconds%60, criticalPath[i].action.Description) } } } func (cp *criticalPathLogger) Message(level MsgLevel, msg string) {} func (cp *criticalPathLogger) Write(p []byte) (n int, err error) { return len(p), nil }