src

Go monorepo.
git clone git://code.dwrz.net/src
Log | Files | Refs

stats.go (1732B)


      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 }