]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: fix deadlock on syntax error
authorhopehook <hopehook.com@gmail.com>
Mon, 4 Apr 2022 15:01:16 +0000 (23:01 +0800)
committerGopher Robot <gobot@golang.org>
Thu, 7 Apr 2022 23:33:12 +0000 (23:33 +0000)
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>

src/cmd/compile/internal/noder/noder.go

index 77ca642183b308d3b4a6452d902be7409ef69daa..bbd73aa8bee061d4538ade90d9b05e6e99c7325e 100644 (file)
@@ -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)
-
-                       f, err := os.Open(filename)
-                       if err != nil {
-                               p.error(syntax.Error{Msg: err.Error()})
-                               return
-                       }
-                       defer f.Close()
+                       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()
 
-                       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 {