35 lines
633 B
Go
35 lines
633 B
Go
|
package gls
|
||
|
|
||
|
// though this could probably be better at keeping ids smaller, the goal of
|
||
|
// this class is to keep a registry of the smallest unique integer ids
|
||
|
// per-process possible
|
||
|
|
||
|
import (
|
||
|
"sync"
|
||
|
)
|
||
|
|
||
|
type idPool struct {
|
||
|
mtx sync.Mutex
|
||
|
released []uint
|
||
|
max_id uint
|
||
|
}
|
||
|
|
||
|
func (p *idPool) Acquire() (id uint) {
|
||
|
p.mtx.Lock()
|
||
|
defer p.mtx.Unlock()
|
||
|
if len(p.released) > 0 {
|
||
|
id = p.released[len(p.released)-1]
|
||
|
p.released = p.released[:len(p.released)-1]
|
||
|
return id
|
||
|
}
|
||
|
id = p.max_id
|
||
|
p.max_id++
|
||
|
return id
|
||
|
}
|
||
|
|
||
|
func (p *idPool) Release(id uint) {
|
||
|
p.mtx.Lock()
|
||
|
defer p.mtx.Unlock()
|
||
|
p.released = append(p.released, id)
|
||
|
}
|