containerd/windows/pid/pid.go
Kenfe-Mickael Laventure 22a051c88e Refactor windows runtime
Signed-off-by: Kenfe-Mickael Laventure <mickael.laventure@gmail.com>
2017-04-11 07:30:59 -07:00

47 lines
590 B
Go

// +build windows
package pid
import (
"errors"
"sync"
)
type Pool struct {
sync.Mutex
pool map[uint32]struct{}
cur uint32
}
func NewPool() *Pool {
return &Pool{
pool: make(map[uint32]struct{}),
}
}
func (p *Pool) Get() (uint32, error) {
p.Lock()
defer p.Unlock()
pid := p.cur + 1
for pid != p.cur {
// 0 is reserved and invalid
if pid == 0 {
pid = 1
}
if _, ok := p.pool[pid]; !ok {
p.cur = pid
return pid, nil
}
pid++
}
return 0, errors.New("pid pool exhausted")
}
func (p *Pool) Put(pid uint32) {
p.Lock()
delete(p.pool, pid)
p.Unlock()
}