diff options
| author | hopehook <hopehook.com@gmail.com> | 2022-04-04 23:01:16 +0800 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2022-04-07 23:33:12 +0000 |
| commit | 5a90270d7f5b384de31399133c7336d007fbd93d (patch) | |
| tree | 57903c28665485567c86398351d12cb3e7b6e797 /src/cmd/compile/internal/noder/noder.go | |
| parent | c451a02a6d3e95d279260bd8c1edae676d62997d (diff) | |
| download | go-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.go | 35 |
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 { |
