mirror of
https://github.com/criyle/go-judge.git
synced 2025-11-04 14:50:02 +08:00
55 lines
1.2 KiB
Go
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
|
|
}
|