go-judge/taskqueue/channel/channel.go
2019-12-31 12:46:03 +08:00

54 lines
1.0 KiB
Go

package channel
import (
"github.com/criyle/go-judge/taskqueue"
"github.com/criyle/go-judge/types"
)
const buffSize = 512
var _ taskqueue.Queue = &Queue{}
// Queue implements taskqueue by buffered go channel
type Queue struct {
queue chan taskqueue.Task
}
// New creates new Queue with buffed go channel
func New() taskqueue.Queue {
return &Queue{
queue: make(chan taskqueue.Task, buffSize),
}
}
// Send puts task into run queue
func (q *Queue) Send(t types.RunTask) (<-chan types.RunTaskResult, error) {
c := make(chan types.RunTaskResult, 1)
q.queue <- Task{
task: t,
result: c,
}
return c, nil
}
// ReceiveC returns the underlying channel
func (q *Queue) ReceiveC() <-chan taskqueue.Task {
return q.queue
}
// Task implements Task interface
type Task struct {
task types.RunTask
result chan<- types.RunTaskResult
}
// Task returns task parameters
func (t Task) Task() *types.RunTask {
return &t.task
}
// Done returns the run task result
func (t Task) Done(r *types.RunTaskResult) {
t.result <- *r
}