go-judge/pkg/envexec/single.go
2020-04-16 20:15:59 -04:00

45 lines
1.0 KiB
Go

package envexec
import (
"fmt"
)
// Single defines the running instruction to run single
// exec in restricted within cgroup
type Single struct {
// EnvironmentPool defines pool used for runner environment
EnvironmentPool EnvironmentPool
// Cmd defines Cmd running in parallel in multiple environments
Cmd *Cmd
}
// Run starts the cmd and returns exec results
func (s *Single) Run() (result Result, err error) {
// prepare files
fd, fileToClose, pipeToCollect, err := prepareCmdFd(s.Cmd, len(s.Cmd.Files))
defer func() { closeFiles(fileToClose) }()
if err != nil {
return result, err
}
// prepare environment
m, err := s.EnvironmentPool.Get()
if err != nil {
return result, fmt.Errorf("failed to get environment %v", err)
}
defer s.EnvironmentPool.Put(m)
result, err = runSingle(m, s.Cmd, fd, pipeToCollect)
fileToClose = nil // already closed by runOne
if err != nil {
result.Status = StatusInternalError
result.Error = err.Error()
return result, err
}
// collect potential error
return result, err
}