@@ -41,7 +41,7 @@ type loadingPackage struct {
41
41
decUseMutex sync.Mutex
42
42
}
43
43
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 {}) {
45
45
lp .analyzeOnce .Do (func () {
46
46
// Load the direct dependencies, in parallel.
47
47
var wg sync.WaitGroup
@@ -50,24 +50,30 @@ func (lp *loadingPackage) analyzeRecursive(stopChan chan struct{}, loadMode Load
50
50
51
51
for _ , imp := range lp .imports {
52
52
go func (imp * loadingPackage ) {
53
- imp .analyzeRecursive (stopChan , loadMode , loadSem )
53
+ imp .analyzeRecursive (ctx , cancel , loadMode , loadSem )
54
54
55
55
wg .Done ()
56
56
}(imp )
57
57
}
58
58
59
59
wg .Wait ()
60
60
61
- lp .analyze (stopChan , loadMode , loadSem )
61
+ lp .analyze (ctx , cancel , loadMode , loadSem )
62
62
})
63
63
}
64
64
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 {}) {
66
66
loadSem <- struct {}{}
67
67
defer func () {
68
68
<- loadSem
69
69
}()
70
70
71
+ select {
72
+ case <- ctx .Done ():
73
+ return
74
+ default :
75
+ }
76
+
71
77
// Save memory on unused more fields.
72
78
defer lp .decUse (loadMode < LoadModeWholeProgram )
73
79
@@ -85,16 +91,14 @@ func (lp *loadingPackage) analyze(stopChan chan struct{}, loadMode LoadMode, loa
85
91
return
86
92
}
87
93
88
- actsWg , ctx := errgroup .WithContext (context . Background () )
94
+ actsWg , ctxGroup := errgroup .WithContext (ctx )
89
95
90
96
for _ , act := range lp .actions {
91
97
actsWg .Go (func () error {
92
- act .waitUntilDependingAnalyzersWorked (ctx , stopChan )
98
+ act .waitUntilDependingAnalyzersWorked (ctxGroup )
93
99
94
100
select {
95
- case <- stopChan :
96
- return nil
97
- case <- ctx .Done ():
101
+ case <- ctxGroup .Done ():
98
102
return nil
99
103
default :
100
104
}
@@ -107,7 +111,7 @@ func (lp *loadingPackage) analyze(stopChan chan struct{}, loadMode LoadMode, loa
107
111
108
112
err := actsWg .Wait ()
109
113
if err != nil {
110
- close ( stopChan )
114
+ cancel ( )
111
115
}
112
116
}
113
117
0 commit comments