1
0
mirror of https://github.com/go-micro/go-micro.git synced 2025-02-10 18:31:40 +02:00
go-micro/util/socket/pool.go

63 lines
920 B
Go
Raw Normal View History

2019-11-27 17:12:07 +00:00
package socket
import (
"sync"
)
type Pool struct {
pool map[string]*Socket
2023-04-26 00:16:34 +00:00
sync.RWMutex
2019-11-27 17:12:07 +00: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 20:18:26 +01: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 17:12:07 +00:00
p.pool[id] = socket
2020-05-27 20:18:26 +01:00
2019-11-27 17:12:07 +00:00
// return socket
return socket, false
}
func (p *Pool) Release(s *Socket) {
p.Lock()
defer p.Unlock()
// close the socket
s.Close()
delete(p.pool, s.id)
}
2022-09-30 16:27:07 +02:00
// Close the pool and delete all the sockets.
2019-11-27 17:12:07 +00:00
func (p *Pool) Close() {
p.Lock()
defer p.Unlock()
for id, sock := range p.pool {
sock.Close()
delete(p.pool, id)
}
}
2022-09-30 16:27:07 +02:00
// NewPool returns a new socket pool.
2019-11-27 17:12:07 +00:00
func NewPool() *Pool {
return &Pool{
pool: make(map[string]*Socket),
}
}