]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: limit the number of simultaneously opened files to avoid EMFILE/ENFILE...
authorzhongtao.chen <chenzhongtao@126.com>
Tue, 22 Aug 2017 02:33:10 +0000 (10:33 +0800)
committerIan Lance Taylor <iant@golang.org>
Thu, 14 Sep 2017 04:02:44 +0000 (04:02 +0000)
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>
src/cmd/compile/internal/gc/noder.go

index ed1b2fd5656b7a2b21b2924e17b0a786a67e8b81..6fb267a1fa59d7ba244830bf5b49efd312aad54f 100644 (file)
@@ -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))