mirror of
https://github.com/criyle/go-judge.git
synced 2025-11-04 14:50:02 +08:00
62 lines
900 B
Go
62 lines
900 B
Go
package runner
|
|
|
|
import (
|
|
"sync/atomic"
|
|
|
|
"github.com/criyle/go-sandbox/daemon"
|
|
)
|
|
|
|
type pool struct {
|
|
builder DaemonBuilder
|
|
queue chan *daemon.Master
|
|
count int32
|
|
}
|
|
|
|
const maxPoolSize = 64
|
|
|
|
func newPool(builder DaemonBuilder) *pool {
|
|
return &pool{
|
|
queue: make(chan *daemon.Master, maxPoolSize),
|
|
builder: builder,
|
|
}
|
|
}
|
|
|
|
func (p *pool) Get() (*daemon.Master, error) {
|
|
select {
|
|
case m := <-p.queue:
|
|
return m, nil
|
|
default:
|
|
}
|
|
atomic.AddInt32(&p.count, 1)
|
|
return p.builder.Build()
|
|
}
|
|
|
|
func (p *pool) Put(master *daemon.Master) {
|
|
master.Reset()
|
|
p.queue <- master
|
|
}
|
|
|
|
func (p *pool) Destroy(master *daemon.Master) {
|
|
master.Destroy()
|
|
atomic.AddInt32(&p.count, -1)
|
|
}
|
|
|
|
func (p *pool) Release() {
|
|
for {
|
|
select {
|
|
case m := <-p.queue:
|
|
p.Destroy(m)
|
|
|
|
default:
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
func (p *pool) Shutdown() {
|
|
for atomic.LoadInt32(&p.count) > 0 {
|
|
m := <-p.queue
|
|
p.Destroy(m)
|
|
}
|
|
}
|