All checks were successful
		
		
	
	test / test (push) Successful in 42s
				
			## Pull Request template Please, go through these steps before clicking submit on this PR. 1. Give a descriptive title to your PR. 2. Provide a description of your changes. 3. Make sure you have some relevant tests. 4. Put `closes #XXXX` in your comment to auto-close the issue that your PR fixes (if applicable). **PLEASE REMOVE THIS TEMPLATE BEFORE SUBMITTING** Reviewed-on: #369 Co-authored-by: Evstigneev Denis <danteevstigneev@yandex.ru> Co-committed-by: Evstigneev Denis <danteevstigneev@yandex.ru>
		
			
				
	
	
		
			66 lines
		
	
	
		
			1021 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1021 B
		
	
	
	
		
			Go
		
	
	
	
	
	
package socket
 | 
						|
 | 
						|
import (
 | 
						|
	"sync"
 | 
						|
)
 | 
						|
 | 
						|
// Pool holds the socket pool
 | 
						|
type Pool struct {
 | 
						|
	pool map[string]*Socket
 | 
						|
	sync.RWMutex
 | 
						|
}
 | 
						|
 | 
						|
// Get socket from pool
 | 
						|
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()
 | 
						|
	defer p.Unlock()
 | 
						|
	// double checked locking
 | 
						|
	socket, ok = p.pool[id]
 | 
						|
	if ok {
 | 
						|
		return socket, ok
 | 
						|
	}
 | 
						|
	// create new socket
 | 
						|
	socket = New(id)
 | 
						|
	p.pool[id] = socket
 | 
						|
 | 
						|
	// return socket
 | 
						|
	return socket, false
 | 
						|
}
 | 
						|
 | 
						|
// Release close the socket and delete from pool
 | 
						|
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),
 | 
						|
	}
 | 
						|
}
 |