aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/noder/noder.go
diff options
context:
space:
mode:
authorhopehook <hopehook.com@gmail.com>2022-04-04 23:01:16 +0800
committerGopher Robot <gobot@golang.org>2022-04-07 23:33:12 +0000
commit5a90270d7f5b384de31399133c7336d007fbd93d (patch)
tree57903c28665485567c86398351d12cb3e7b6e797 /src/cmd/compile/internal/noder/noder.go
parentc451a02a6d3e95d279260bd8c1edae676d62997d (diff)
downloadgo-5a90270d7f5b384de31399133c7336d007fbd93d.tar.xz
cmd/compile: fix deadlock on syntax error
Fixes #52127 Change-Id: I6523c83350cb9263d23e3e8b472fe63a5cc99c2e Reviewed-on: https://go-review.googlesource.com/c/go/+/398014 Reviewed-by: Matthew Dempsky <mdempsky@google.com> Run-TryBot: Matthew Dempsky <mdempsky@google.com> Auto-Submit: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Trust: Cherry Mui <cherryyz@google.com>
Diffstat (limited to 'src/cmd/compile/internal/noder/noder.go')
-rw-r--r--src/cmd/compile/internal/noder/noder.go35
1 files changed, 20 insertions, 15 deletions
diff --git a/src/cmd/compile/internal/noder/noder.go b/src/cmd/compile/internal/noder/noder.go
index 77ca642183..bbd73aa8be 100644
--- a/src/cmd/compile/internal/noder/noder.go
+++ b/src/cmd/compile/internal/noder/noder.go
@@ -33,29 +33,34 @@ func LoadPackage(filenames []string) {
sem := make(chan struct{}, runtime.GOMAXPROCS(0)+10)
noders := make([]*noder, len(filenames))
- for i, filename := range filenames {
+ for i := range noders {
p := noder{
err: make(chan syntax.Error),
}
noders[i] = &p
+ }
- filename := filename
- go func() {
+ go func() {
+ for i, filename := range filenames {
+ filename := filename
+ p := noders[i]
sem <- struct{}{}
- defer func() { <-sem }()
- defer close(p.err)
- fbase := syntax.NewFileBase(filename)
+ go func() {
+ defer func() { <-sem }()
+ defer close(p.err)
+ fbase := syntax.NewFileBase(filename)
- f, err := os.Open(filename)
- if err != nil {
- p.error(syntax.Error{Msg: err.Error()})
- return
- }
- defer f.Close()
+ f, err := os.Open(filename)
+ if err != nil {
+ p.error(syntax.Error{Msg: err.Error()})
+ return
+ }
+ defer f.Close()
- p.file, _ = syntax.Parse(fbase, f, p.error, p.pragma, mode) // errors are tracked via p.error
- }()
- }
+ p.file, _ = syntax.Parse(fbase, f, p.error, p.pragma, mode) // errors are tracked via p.error
+ }()
+ }
+ }()
var lines uint
for _, p := range noders {