stats.go raw

   1  package runner
   2  
   3  import (
   4  	"sync/atomic"
   5  	"time"
   6  
   7  	"honnef.co/go/tools/go/loader"
   8  
   9  	"golang.org/x/tools/go/analysis"
  10  )
  11  
  12  const (
  13  	StateInitializing = iota
  14  	StateLoadPackageGraph
  15  	StateBuildActionGraph
  16  	StateProcessing
  17  	StateFinalizing
  18  )
  19  
  20  type Stats struct {
  21  	state                    uint32
  22  	initialPackages          uint32
  23  	totalPackages            uint32
  24  	processedPackages        uint32
  25  	processedInitialPackages uint32
  26  
  27  	// optional function to call every time an analyzer has finished analyzing a package.
  28  	PrintAnalyzerMeasurement func(*analysis.Analyzer, *loader.PackageSpec, time.Duration)
  29  }
  30  
  31  func (s *Stats) setState(state uint32)    { atomic.StoreUint32(&s.state, state) }
  32  func (s *Stats) State() int               { return int(atomic.LoadUint32(&s.state)) }
  33  func (s *Stats) setInitialPackages(n int) { atomic.StoreUint32(&s.initialPackages, uint32(n)) }
  34  func (s *Stats) InitialPackages() int     { return int(atomic.LoadUint32(&s.initialPackages)) }
  35  func (s *Stats) setTotalPackages(n int)   { atomic.StoreUint32(&s.totalPackages, uint32(n)) }
  36  func (s *Stats) TotalPackages() int       { return int(atomic.LoadUint32(&s.totalPackages)) }
  37  
  38  func (s *Stats) finishPackage()         { atomic.AddUint32(&s.processedPackages, 1) }
  39  func (s *Stats) finishInitialPackage()  { atomic.AddUint32(&s.processedInitialPackages, 1) }
  40  func (s *Stats) ProcessedPackages() int { return int(atomic.LoadUint32(&s.processedPackages)) }
  41  func (s *Stats) ProcessedInitialPackages() int {
  42  	return int(atomic.LoadUint32(&s.processedInitialPackages))
  43  }
  44  
  45  func (s *Stats) measureAnalyzer(analysis *analysis.Analyzer, pkg *loader.PackageSpec, d time.Duration) {
  46  	if s.PrintAnalyzerMeasurement != nil {
  47  		s.PrintAnalyzerMeasurement(analysis, pkg, d)
  48  	}
  49  }
  50