package runner import ( "git.0x7f.app/WOJ/woj-server/internal/e" "git.0x7f.app/WOJ/woj-server/internal/misc/config" "git.0x7f.app/WOJ/woj-server/internal/misc/log" "git.0x7f.app/WOJ/woj-server/pkg/pool" "git.0x7f.app/WOJ/woj-server/pkg/utils" "github.com/samber/do" "go.uber.org/zap" "runtime" ) var _ Service = (*service)(nil) type Service interface { // EnsureDeps build docker images EnsureDeps() e.Status // NewProblem = Download + Parse + Prebuild NewProblem(meta *JudgeMeta, url string, force bool) (*Config, e.Status) // Compile compile user submission Compile(meta *JudgeMeta) (*JudgeStatus, e.Status) // RunAndJudge execute user program RunAndJudge(meta *JudgeMeta) (*JudgeStatus, int32, e.Status) // ParseConfig parse config file ParseConfig(meta *JudgeMeta, skipCheck bool) (*Config, error) // ProblemExists check if problem exists ProblemExists(meta *JudgeMeta) bool // ValidatePath check if problem/user exists ValidatePath(meta *JudgeMeta) (*JudgeStatus, e.Status) // GetConfig return config and filter language config, will fill result to meta.Config GetConfig(meta *JudgeMeta, skipCheck bool) e.Status HealthCheck() error Shutdown() error } func NewService(i *do.Injector) (Service, error) { cfg := do.MustInvoke[config.Service](i).GetConfig() concurrency := cfg.Runner.Concurrency if concurrency <= 0 { concurrency = utils.If(runtime.NumCPU() > 1, runtime.NumCPU()-1, 1) } srv := &service{ log: do.MustInvoke[log.Service](i).GetLogger("runner"), pool: pool.NewTaskPool(concurrency, concurrency), cgroup: cfg.Runner.CGroup, verbose: cfg.Development, } srv.pool.Start() return srv, nil } type service struct { log *zap.Logger pool *pool.TaskPool cgroup string verbose bool } func (s *service) HealthCheck() error { return nil } func (s *service) Shutdown() error { s.pool.Stop() return nil }