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),
 | |
| 	}
 | |
| }
 |