master
go 45 lines 746 Bytes
Raw
1 package as400
2
3 import (
4 "maps"
5 "sync"
6 "time"
7 )
8
9 type latencyCache struct {
10 mu sync.RWMutex
11 values map[string]int64
12 last time.Time
13 }
14
15 func (l *latencyCache) beginCycle(ts time.Time) {
16 l.mu.Lock()
17 if l.values == nil {
18 l.values = make(map[string]int64)
19 }
20 l.last = ts
21 l.mu.Unlock()
22 }
23
24 func (l *latencyCache) add(name string, value int64) {
25 if value == 0 {
26 return
27 }
28 l.mu.Lock()
29 if l.values == nil {
30 l.values = make(map[string]int64)
31 }
32 l.values[name] += value
33 l.mu.Unlock()
34 }
35
36 func (l *latencyCache) snapshot() (map[string]int64, time.Time) {
37 l.mu.RLock()
38 defer l.mu.RUnlock()
39 if len(l.values) == 0 {
40 return nil, l.last
41 }
42 out := make(map[string]int64, len(l.values))
43 maps.Copy(out, l.values)
44 return out, l.last
45 }