mirror of
https://github.com/criyle/go-judge.git
synced 2025-11-04 14:50:02 +08:00
51 lines
1.0 KiB
Go
51 lines
1.0 KiB
Go
package taskqueue
|
|
|
|
import (
|
|
"github.com/criyle/go-judge/runner"
|
|
)
|
|
|
|
var _ runner.Queue = &ChannelQueue{}
|
|
|
|
// ChannelQueue implements taskqueue by buffered go channel
|
|
type ChannelQueue struct {
|
|
queue chan runner.Task
|
|
}
|
|
|
|
// NewChannelQueue creates new Queue with buffed go channel
|
|
func NewChannelQueue(size int) runner.Queue {
|
|
return &ChannelQueue{
|
|
queue: make(chan runner.Task, size),
|
|
}
|
|
}
|
|
|
|
// Send puts task into run queue
|
|
func (q *ChannelQueue) Send(t runner.RunTask) (<-chan runner.RunTaskResult, error) {
|
|
c := make(chan runner.RunTaskResult, 1)
|
|
q.queue <- Task{
|
|
task: t,
|
|
result: c,
|
|
}
|
|
return c, nil
|
|
}
|
|
|
|
// ReceiveC returns the underlying channel
|
|
func (q *ChannelQueue) ReceiveC() <-chan runner.Task {
|
|
return q.queue
|
|
}
|
|
|
|
// Task implements Task interface
|
|
type Task struct {
|
|
task runner.RunTask
|
|
result chan<- runner.RunTaskResult
|
|
}
|
|
|
|
// Task returns task parameters
|
|
func (t Task) Task() *runner.RunTask {
|
|
return &t.task
|
|
}
|
|
|
|
// Done returns the run task result
|
|
func (t Task) Done(r *runner.RunTaskResult) {
|
|
t.result <- *r
|
|
}
|