cmd/go/internal/modload: change Requirements.graph type to atomic.Pointer[cachedGraph]

This commit is contained in:
Abirdcfly 2022-09-07 00:18:33 +08:00
parent ccf82d5323
commit ed993dbe24
2 changed files with 6 additions and 6 deletions

View file

@ -73,8 +73,8 @@ type Requirements struct {
// nested module back into a parent module). // nested module back into a parent module).
direct map[string]bool direct map[string]bool
graphOnce sync.Once // guards writes to (but not reads from) graph graphOnce sync.Once // guards writes to (but not reads from) graph
graph atomic.Value // cachedGraph graph atomic.Pointer[cachedGraph]
} }
// A cachedGraph is a non-nil *ModuleGraph, together with any error discovered // A cachedGraph is a non-nil *ModuleGraph, together with any error discovered
@ -199,7 +199,7 @@ func (rs *Requirements) initVendor(vendorList []module.Version) {
mg.g.Require(vendorMod, vendorList) mg.g.Require(vendorMod, vendorList)
} }
rs.graph.Store(cachedGraph{mg, nil}) rs.graph.Store(&cachedGraph{mg, nil})
}) })
} }
@ -240,9 +240,9 @@ func (rs *Requirements) hasRedundantRoot() bool {
func (rs *Requirements) Graph(ctx context.Context) (*ModuleGraph, error) { func (rs *Requirements) Graph(ctx context.Context) (*ModuleGraph, error) {
rs.graphOnce.Do(func() { rs.graphOnce.Do(func() {
mg, mgErr := readModGraph(ctx, rs.pruning, rs.rootModules) mg, mgErr := readModGraph(ctx, rs.pruning, rs.rootModules)
rs.graph.Store(cachedGraph{mg, mgErr}) rs.graph.Store(&cachedGraph{mg, mgErr})
}) })
cached := rs.graph.Load().(cachedGraph) cached := rs.graph.Load()
return cached.mg, cached.err return cached.mg, cached.err
} }

View file

@ -1837,7 +1837,7 @@ func (ld *loader) computePatternAll() (all []string) {
func (ld *loader) checkMultiplePaths() { func (ld *loader) checkMultiplePaths() {
mods := ld.requirements.rootModules mods := ld.requirements.rootModules
if cached := ld.requirements.graph.Load(); cached != nil { if cached := ld.requirements.graph.Load(); cached != nil {
if mg := cached.(cachedGraph).mg; mg != nil { if mg := cached.mg; mg != nil {
mods = mg.BuildList() mods = mg.BuildList()
} }
} }