go-judge/runner/runner.go
2019-09-01 20:40:34 -07:00

39 lines
663 B
Go

package runner
import (
"github.com/criyle/go-judge/language"
"github.com/criyle/go-judge/taskqueue"
)
// Runner is the task runner
type Runner struct {
Queue taskqueue.Queue
Language language.Language
Root string
pool *pool
}
// Loop status a runner in a forever loop, waiting for task and execute
// call it in new goroutine
func (r *Runner) Loop(done <-chan struct{}) error {
if r.pool == nil {
r.pool = newPool(r.Root)
}
c := r.Queue.C()
loop:
for {
select {
case <-done:
break loop
case task := <-c:
select {
case <-done:
break loop
default:
task.Finish(r.run(done, task.Task()))
}
}
}
return nil
}