// counter package main import ( "sync" "time" ) type Counter struct { mu sync.Mutex user int log int rem int err int dup int time time.Duration wg []int } func NewCounter() *Counter { return &Counter{ user: 0, log: 0, err: 0, rem: 0, dup: 0, time: 0, wg: make([]int, opts.Concurrent), } } func (c *Counter) AddUser() { c.mu.Lock() defer c.mu.Unlock() c.user++ } func (c *Counter) AddDuplicate() { c.mu.Lock() defer c.mu.Unlock() c.dup++ } func (c *Counter) AddLog(add int) { c.mu.Lock() defer c.mu.Unlock() c.log += add } func (c *Counter) AddRem(add int) { c.mu.Lock() defer c.mu.Unlock() c.rem += add } func (c *Counter) AddWG(id int) { c.mu.Lock() defer c.mu.Unlock() c.wg[id]++ } func (c *Counter) AddErr() { c.mu.Lock() defer c.mu.Unlock() c.err++ } func (c *Counter) DelWG(id int) { c.mu.Lock() defer c.mu.Unlock() c.wg[id]-- } func (c *Counter) GetUser() (ret int) { c.mu.Lock() defer c.mu.Unlock() ret = c.user return } func (c *Counter) GetDup() (ret int) { c.mu.Lock() defer c.mu.Unlock() ret = c.dup return } func (c *Counter) GetLog() (ret int) { c.mu.Lock() defer c.mu.Unlock() ret = c.log return } func (c *Counter) GetErr() (ret int) { c.mu.Lock() defer c.mu.Unlock() ret = c.err return } func (c *Counter) GetRem() (ret int) { c.mu.Lock() defer c.mu.Unlock() ret = c.rem return } func (c *Counter) GetWG(id int) (ret int) { c.mu.Lock() defer c.mu.Unlock() ret = c.wg[id] return } func (c *Counter) GetTime() (ret float64) { c.mu.Lock() defer c.mu.Unlock() ret = c.time.Seconds() return } func (c *Counter) SetTime(t time.Duration) { c.mu.Lock() defer c.mu.Unlock() c.time = t }