package hy import ( "sync" "sync/atomic" ) type UserTrafficCounter struct { counters map[string]*counters lock sync.RWMutex } type counters struct { UpCounter atomic.Int64 DownCounter atomic.Int64 //ConnGauge atomic.Int64 } func NewUserTrafficCounter() *UserTrafficCounter { return &UserTrafficCounter{ counters: map[string]*counters{}, } } func (c *UserTrafficCounter) getCounters(auth string) *counters { c.lock.RLock() cts, ok := c.counters[auth] c.lock.RUnlock() if !ok { cts = &counters{} c.counters[auth] = cts } return cts } func (c *UserTrafficCounter) Rx(auth string, n int) { cts := c.getCounters(auth) cts.DownCounter.Add(int64(n)) } func (c *UserTrafficCounter) Tx(auth string, n int) { cts := c.getCounters(auth) cts.UpCounter.Add(int64(n)) } func (c *UserTrafficCounter) IncConn(_ string) { /*cts := c.getCounters(auth) cts.ConnGauge.Add(1)*/ return } func (c *UserTrafficCounter) DecConn(_ string) { /*cts := c.getCounters(auth) cts.ConnGauge.Add(1)*/ return } func (c *UserTrafficCounter) Reset(auth string) { cts := c.getCounters(auth) cts.UpCounter.Store(0) cts.DownCounter.Store(0) } func (c *UserTrafficCounter) Delete(auth string) { c.lock.Lock() delete(c.counters, auth) c.lock.Unlock() }