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