2016-01-17 17:45:37 -08:00
|
|
|
package server
|
|
|
|
|
|
|
|
import (
|
|
|
|
"sync"
|
|
|
|
)
|
|
|
|
|
|
|
|
type StringPool struct {
|
|
|
|
sync.RWMutex
|
2016-01-17 19:46:01 -08:00
|
|
|
lookup map[string]string
|
2016-01-17 17:45:37 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
func NewStringPool() *StringPool {
|
2016-01-17 19:46:01 -08:00
|
|
|
return &StringPool{lookup: make(map[string]string)}
|
2016-01-17 17:45:37 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
// doesn't lock, doesn't check for dupes.
|
|
|
|
func (p *StringPool) _Intern_Setup(s string) {
|
2016-01-17 19:46:01 -08:00
|
|
|
p.lookup[s] = s
|
2016-01-17 17:45:37 -08:00
|
|
|
}
|
|
|
|
|
2016-01-17 19:46:01 -08:00
|
|
|
func (p *StringPool) InternCommand(s string) Command {
|
|
|
|
return Command(p.Intern(s))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (p *StringPool) Intern(s string) string {
|
2016-01-17 17:45:37 -08:00
|
|
|
p.RLock()
|
|
|
|
ss, exists := p.lookup[s]
|
|
|
|
p.RUnlock()
|
|
|
|
if exists {
|
|
|
|
return ss
|
|
|
|
}
|
|
|
|
|
|
|
|
p.Lock()
|
|
|
|
defer p.Unlock()
|
|
|
|
ss, exists = p.lookup[s]
|
|
|
|
if exists {
|
|
|
|
return ss
|
|
|
|
}
|
2016-01-17 19:46:01 -08:00
|
|
|
ss = copyString(s)
|
|
|
|
p.lookup[ss] = ss
|
2016-01-17 18:01:21 -08:00
|
|
|
return ss
|
2016-01-17 17:45:37 -08:00
|
|
|
}
|