diff --git a/go.mod b/go.mod index 0b59036..263a929 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/criyle/go-judge go 1.13 require ( - github.com/criyle/go-sandbox v0.0.0-20200220013035-33a7b2b603c2 + github.com/criyle/go-sandbox v0.0.0-20200221071805-5b50e9db4d0d github.com/googollee/go-engine.io v1.4.3-0.20200211083925-ac1f0a0b48dd github.com/googollee/go-socket.io v1.4.2 github.com/ugorji/go/codec v1.1.7 diff --git a/go.sum b/go.sum index 7b20343..daabbf7 100644 --- a/go.sum +++ b/go.sum @@ -12,8 +12,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/criyle/go-sandbox v0.0.0-20200220013035-33a7b2b603c2 h1:JcoYAvzbmUPQ1W6rc5zpl60edjGE0xwQUnj2uBkMesQ= -github.com/criyle/go-sandbox v0.0.0-20200220013035-33a7b2b603c2/go.mod h1:32Edg/qMDGZRUMvCCqT3m5vbdL8p1Cro9A1MEj3fQ6o= +github.com/criyle/go-sandbox v0.0.0-20200221071805-5b50e9db4d0d h1:9q4gpfGyTNm/5weXAL86oXzm7NNd3Dg9dI2jWyUvURw= +github.com/criyle/go-sandbox v0.0.0-20200221071805-5b50e9db4d0d/go.mod h1:32Edg/qMDGZRUMvCCqT3m5vbdL8p1Cro9A1MEj3fQ6o= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/pkg/runner/file.go b/pkg/runner/file.go index 69b4077..c6e1db1 100644 --- a/pkg/runner/file.go +++ b/pkg/runner/file.go @@ -25,6 +25,8 @@ func prepareFds(r *Runner) ([][]*os.File, [][]pipeBuff, []*os.File, error) { prepareCmdFd := func(c *Cmd, count int) ([]*os.File, []pipeBuff, error) { fd := make([]*os.File, count) + // record same name buffer for one command to avoid multiple pipe creation + pb := make(map[string]*pipe.Buffer) var ptc []pipeBuff for j, t := range c.Files { @@ -45,11 +47,17 @@ func prepareFds(r *Runner) ([][]*os.File, [][]pipeBuff, []*os.File, error) { fileToClose = append(fileToClose, f) case PipeCollector: + if b, ok := pb[t.Name]; ok { + fd[j] = b.W + break + } + b, err := pipe.NewBuffer(t.SizeLimit) if err != nil { return nil, nil, fmt.Errorf("failed to create pipe %v", err) } fd[j] = b.W + pb[t.Name] = b ptc = append(ptc, pipeBuff{b, t.Name}) fileToClose = append(fileToClose, b.W) @@ -57,6 +65,7 @@ func prepareFds(r *Runner) ([][]*os.File, [][]pipeBuff, []*os.File, error) { return nil, nil, fmt.Errorf("unknown file type %v", t) } } + return fd, ptc, nil }