mirror of
https://github.com/golang/go
synced 2024-11-18 17:34:51 -07:00
go/packages: do not return from goListDriver with goroutines still in flight
This fixes a race found in https://storage.googleapis.com/go-build-log/0ae93896/linux-amd64-race_e84a66dd.log. Change-Id: I6b928e3b96378d458b48cf1f27341775a3dd0601 Reviewed-on: https://go-review.googlesource.com/c/tools/+/203897 Run-TryBot: Bryan C. Mills <bcmills@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Michael Matloob <matloob@golang.org>
This commit is contained in:
parent
c8a4b8d038
commit
b394bd8bba
@ -110,6 +110,7 @@ func goListDriver(cfg *Config, patterns ...string) (*driverResponse, error) {
|
|||||||
sizeswg.Done()
|
sizeswg.Done()
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
defer sizeswg.Wait()
|
||||||
|
|
||||||
// start fetching rootDirs
|
// start fetching rootDirs
|
||||||
var info goInfo
|
var info goInfo
|
||||||
@ -128,6 +129,10 @@ func goListDriver(cfg *Config, patterns ...string) (*driverResponse, error) {
|
|||||||
return &info
|
return &info
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ensure that we don't leak goroutines: Load is synchronous, so callers will
|
||||||
|
// not expect it to access the fields of cfg after the call returns.
|
||||||
|
defer getGoInfo()
|
||||||
|
|
||||||
// always pass getGoInfo to golistDriver
|
// always pass getGoInfo to golistDriver
|
||||||
golistDriver := func(cfg *Config, patterns ...string) (*driverResponse, error) {
|
golistDriver := func(cfg *Config, patterns ...string) (*driverResponse, error) {
|
||||||
return golistDriver(cfg, getGoInfo, patterns...)
|
return golistDriver(cfg, getGoInfo, patterns...)
|
||||||
@ -734,9 +739,9 @@ func golistDriver(cfg *Config, rootsDirs func() *goInfo, words ...string) (*driv
|
|||||||
// go list uses the following identifiers in ImportPath and Imports:
|
// go list uses the following identifiers in ImportPath and Imports:
|
||||||
//
|
//
|
||||||
// "p" -- importable package or main (command)
|
// "p" -- importable package or main (command)
|
||||||
// "q.test" -- q's test executable
|
// "q.test" -- q's test executable
|
||||||
// "p [q.test]" -- variant of p as built for q's test executable
|
// "p [q.test]" -- variant of p as built for q's test executable
|
||||||
// "q_test [q.test]" -- q's external test package
|
// "q_test [q.test]" -- q's external test package
|
||||||
//
|
//
|
||||||
// The packages p that are built differently for a test q.test
|
// The packages p that are built differently for a test q.test
|
||||||
// are q itself, plus any helpers used by the external test q_test,
|
// are q itself, plus any helpers used by the external test q_test,
|
||||||
|
Loading…
Reference in New Issue
Block a user