@@ -41,7 +41,7 @@ type loadingPackage struct {
4141 decUseMutex sync.Mutex
4242}
4343
44- func (lp * loadingPackage ) analyzeRecursive (stopChan chan struct {} , loadMode LoadMode , loadSem chan struct {}) {
44+ func (lp * loadingPackage ) analyzeRecursive (ctx context. Context , cancel context. CancelFunc , loadMode LoadMode , loadSem chan struct {}) {
4545 lp .analyzeOnce .Do (func () {
4646 // Load the direct dependencies, in parallel.
4747 var wg sync.WaitGroup
@@ -50,24 +50,30 @@ func (lp *loadingPackage) analyzeRecursive(stopChan chan struct{}, loadMode Load
5050
5151 for _ , imp := range lp .imports {
5252 go func (imp * loadingPackage ) {
53- imp .analyzeRecursive (stopChan , loadMode , loadSem )
53+ imp .analyzeRecursive (ctx , cancel , loadMode , loadSem )
5454
5555 wg .Done ()
5656 }(imp )
5757 }
5858
5959 wg .Wait ()
6060
61- lp .analyze (stopChan , loadMode , loadSem )
61+ lp .analyze (ctx , cancel , loadMode , loadSem )
6262 })
6363}
6464
65- func (lp * loadingPackage ) analyze (stopChan chan struct {} , loadMode LoadMode , loadSem chan struct {}) {
65+ func (lp * loadingPackage ) analyze (ctx context. Context , cancel context. CancelFunc , loadMode LoadMode , loadSem chan struct {}) {
6666 loadSem <- struct {}{}
6767 defer func () {
6868 <- loadSem
6969 }()
7070
71+ select {
72+ case <- ctx .Done ():
73+ return
74+ default :
75+ }
76+
7177 // Save memory on unused more fields.
7278 defer lp .decUse (loadMode < LoadModeWholeProgram )
7379
@@ -85,16 +91,14 @@ func (lp *loadingPackage) analyze(stopChan chan struct{}, loadMode LoadMode, loa
8591 return
8692 }
8793
88- actsWg , ctx := errgroup .WithContext (context . Background () )
94+ actsWg , ctxGroup := errgroup .WithContext (ctx )
8995
9096 for _ , act := range lp .actions {
9197 actsWg .Go (func () error {
92- act .waitUntilDependingAnalyzersWorked (ctx , stopChan )
98+ act .waitUntilDependingAnalyzersWorked (ctxGroup )
9399
94100 select {
95- case <- stopChan :
96- return nil
97- case <- ctx .Done ():
101+ case <- ctxGroup .Done ():
98102 return nil
99103 default :
100104 }
@@ -107,7 +111,7 @@ func (lp *loadingPackage) analyze(stopChan chan struct{}, loadMode LoadMode, loa
107111
108112 err := actsWg .Wait ()
109113 if err != nil {
110- close ( stopChan )
114+ cancel ( )
111115 }
112116}
113117
0 commit comments