diff options
author | zhongtao.chen <chenzhongtao@126.com> | 2017-08-22 10:33:10 +0800 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2017-10-25 20:22:53 +0000 |
commit | 5c48811aec6fab7979edcde4de09a0d2380fb175 (patch) | |
tree | d0a807270f2c9895bfe69acf4afb16fcd007928e | |
parent | 8c7fa95ad3420779ecffc9c72afc82bf074c6a88 (diff) | |
download | go-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.go | 5 |
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)) |