| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 | 
							- package common
 
- import (
 
- 	"sync"
 
- 	"sync/atomic"
 
- 	"github.com/drakkan/sftpgo/v2/logger"
 
- )
 
- // clienstMap is a struct containing the map of the connected clients
 
- type clientsMap struct {
 
- 	totalConnections int32
 
- 	mu               sync.RWMutex
 
- 	clients          map[string]int
 
- }
 
- func (c *clientsMap) add(source string) {
 
- 	atomic.AddInt32(&c.totalConnections, 1)
 
- 	c.mu.Lock()
 
- 	defer c.mu.Unlock()
 
- 	c.clients[source]++
 
- }
 
- func (c *clientsMap) remove(source string) {
 
- 	c.mu.Lock()
 
- 	defer c.mu.Unlock()
 
- 	if val, ok := c.clients[source]; ok {
 
- 		atomic.AddInt32(&c.totalConnections, -1)
 
- 		c.clients[source]--
 
- 		if val > 1 {
 
- 			return
 
- 		}
 
- 		delete(c.clients, source)
 
- 	} else {
 
- 		logger.Warn(logSender, "", "cannot remove client %v it is not mapped", source)
 
- 	}
 
- }
 
- func (c *clientsMap) getTotal() int32 {
 
- 	return atomic.LoadInt32(&c.totalConnections)
 
- }
 
- func (c *clientsMap) getTotalFrom(source string) int {
 
- 	c.mu.RLock()
 
- 	defer c.mu.RUnlock()
 
- 	return c.clients[source]
 
- }
 
 
  |