go-judge/pkg/envexec/single.go
criyle 1f86f25995 Refactor & Documentation
- pkg/runner -> pkg/envexec
- add idea about executor server
2020-03-03 02:32:59 -05:00

55 lines
1.2 KiB
Go

package envexec
import (
"fmt"
)
// Single defines the running instruction to run single
// exec in restricted within cgroup
type Single struct {
// CgroupPool defines pool of cgroup used for Cmd
CgroupPool CgroupPool
// 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)
// prepare cgroup
cg, err := s.CgroupPool.Get()
if err != nil {
return result, fmt.Errorf("failed to get cgroup %v", err)
}
defer s.CgroupPool.Put(cg)
result, err = runSingle(m, cg, 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
}