Skip to content

Commit 70f47b7

Browse files
committed
Add a sync.Mutex field into TypeChecker
This avoids race condition which may happen when multiple goroutines try to modify the `checkedPackages` field of TypeChecker simultaneously. Signed-off-by: Haiyan Meng <[email protected]>
1 parent cf8f8c9 commit 70f47b7

File tree

1 file changed

+7
-1
lines changed

1 file changed

+7
-1
lines changed

pkg/loader/refs.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ func allReferencedPackages(pkg *Package, filterNodes NodeFilter) []*Package {
187187
type TypeChecker struct {
188188
checkedPackages map[*Package]struct{}
189189
filterNodes NodeFilter
190+
sync.Mutex
190191
}
191192

192193
// Check type-checks the given package and all packages referenced
@@ -224,7 +225,10 @@ func (c *TypeChecker) check(root *Package) {
224225
root.Lock()
225226
defer root.Unlock()
226227

227-
if _, ok := c.checkedPackages[root]; ok {
228+
c.Lock()
229+
_, ok := c.checkedPackages[root]
230+
c.Unlock()
231+
if ok {
228232
return
229233
}
230234

@@ -244,5 +248,7 @@ func (c *TypeChecker) check(root *Package) {
244248
// ...then, we can safely type-check ourself
245249
root.NeedTypesInfo()
246250

251+
c.Lock()
252+
defer c.Unlock()
247253
c.checkedPackages[root] = struct{}{}
248254
}

0 commit comments

Comments
 (0)