micro/util/socket/pool.go

66 lines
1021 B
Go
Raw Normal View History

2019-11-27 20:12:07 +03:00
package socket
import (
"sync"
)
// Pool holds the socket pool
2019-11-27 20:12:07 +03:00
type Pool struct {
sync.RWMutex
pool map[string]*Socket
}
// Get socket from pool
2019-11-27 20:12:07 +03:00
func (p *Pool) Get(id string) (*Socket, bool) {
// attempt to get existing socket
p.RLock()
socket, ok := p.pool[id]
if ok {
p.RUnlock()
return socket, ok
}
p.RUnlock()
// save socket
p.Lock()
2020-05-27 22:18:26 +03:00
defer p.Unlock()
// double checked locking
socket, ok = p.pool[id]
if ok {
return socket, ok
}
// create new socket
socket = New(id)
2019-11-27 20:12:07 +03:00
p.pool[id] = socket
2020-05-27 22:18:26 +03:00
2019-11-27 20:12:07 +03:00
// return socket
return socket, false
}
// Release close the socket and delete from pool
2019-11-27 20:12:07 +03:00
func (p *Pool) Release(s *Socket) {
p.Lock()
defer p.Unlock()
// close the socket
s.Close()
delete(p.pool, s.id)
}
// Close the pool and delete all the sockets
func (p *Pool) Close() {
p.Lock()
defer p.Unlock()
for id, sock := range p.pool {
sock.Close()
delete(p.pool, id)
}
}
// NewPool returns a new socket pool
func NewPool() *Pool {
return &Pool{
pool: make(map[string]*Socket),
}
}