connmanage.go 973 Bytes
package components

import "sync"

type ConnManage struct {
	mu    sync.RWMutex
	conns map[uint32]IConnection
}

func NewConnManage() *ConnManage {
	return &ConnManage{
		mu:    sync.RWMutex{},
		conns: make(map[uint32]IConnection),
	}
}

func (c *ConnManage) AddConn(id uint32, connection IConnection) {
	c.mu.Lock()
	defer c.mu.Unlock()
	c.conns[id] = connection
}

func (c *ConnManage) GetConn(id uint32) IConnection {
	c.mu.RLock()
	defer c.mu.RUnlock()
	return c.conns[id]
}

func (c *ConnManage) DelConn(id uint32) IConnection {
	c.mu.Lock()
	defer c.mu.Unlock()
	conn := c.conns[id]
	delete(c.conns, id)
	return conn
}

func (c *ConnManage) Range(f func(key interface{}, value interface{}) bool) {
	c.mu.Lock()
	defer c.mu.Unlock()
	for k, v := range c.conns {
		if ok := f(k, v); !ok {
			return
		}
	}
}

func (c *ConnManage) StopAllConns() {
	c.Range(func(key interface{}, value interface{}) bool {
		conn := value.(IConnection)
		conn.Stop()
		return true
	})
}