aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzhongtao.chen <chenzhongtao@126.com>2017-08-22 10:33:10 +0800
committerRuss Cox <rsc@golang.org>2017-10-25 20:22:53 +0000
commit5c48811aec6fab7979edcde4de09a0d2380fb175 (patch)
treed0a807270f2c9895bfe69acf4afb16fcd007928e
parent8c7fa95ad3420779ecffc9c72afc82bf074c6a88 (diff)
downloadgo-5c48811aec6fab7979edcde4de09a0d2380fb175.tar.gz
go-5c48811aec6fab7979edcde4de09a0d2380fb175.zip
[release-branch.go1.9] cmd/compile: limit the number of simultaneously opened files to avoid EMFILE/ENFILE errors
If the Go packages with enough source files,it will cause EMFILE/ENFILE error, Fix this by limiting the number of simultaneously opened files. Fixes #21621 Change-Id: I8555d79242d2f90771e37e073b7540fc7194a64a Reviewed-on: https://go-review.googlesource.com/57751 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org> Reviewed-on: https://go-review.googlesource.com/63752 Run-TryBot: Russ Cox <rsc@golang.org>
-rw-r--r--src/cmd/compile/internal/gc/noder.go5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/gc/noder.go b/src/cmd/compile/internal/gc/noder.go
index 5f19948222..7a1ea2707c 100644
--- a/src/cmd/compile/internal/gc/noder.go
+++ b/src/cmd/compile/internal/gc/noder.go
@@ -7,6 +7,7 @@ package gc
import (
"fmt"
"os"
+ "runtime"
"strconv"
"strings"
"unicode/utf8"
@@ -20,12 +21,16 @@ import (
func parseFiles(filenames []string) uint {
var lines uint
var noders []*noder
+ // Limit the number of simultaneously open files.
+ sem := make(chan struct{}, runtime.GOMAXPROCS(0)+10)
for _, filename := range filenames {
p := &noder{err: make(chan syntax.Error)}
noders = append(noders, p)
go func(filename string) {
+ sem <- struct{}{}
+ defer func() { <-sem }()
defer close(p.err)
base := src.NewFileBase(filename, absFilename(filename))