]>
Commit | Line | Data |
---|---|---|
15c0b25d AP |
1 | package csm |
2 | ||
3 | import ( | |
4 | "sync/atomic" | |
5 | ) | |
6 | ||
7 | const ( | |
8 | runningEnum = iota | |
9 | pausedEnum | |
10 | ) | |
11 | ||
12 | var ( | |
13 | // MetricsChannelSize of metrics to hold in the channel | |
14 | MetricsChannelSize = 100 | |
15 | ) | |
16 | ||
17 | type metricChan struct { | |
18 | ch chan metric | |
19 | paused int64 | |
20 | } | |
21 | ||
22 | func newMetricChan(size int) metricChan { | |
23 | return metricChan{ | |
24 | ch: make(chan metric, size), | |
25 | } | |
26 | } | |
27 | ||
28 | func (ch *metricChan) Pause() { | |
29 | atomic.StoreInt64(&ch.paused, pausedEnum) | |
30 | } | |
31 | ||
32 | func (ch *metricChan) Continue() { | |
33 | atomic.StoreInt64(&ch.paused, runningEnum) | |
34 | } | |
35 | ||
36 | func (ch *metricChan) IsPaused() bool { | |
37 | v := atomic.LoadInt64(&ch.paused) | |
38 | return v == pausedEnum | |
39 | } | |
40 | ||
41 | // Push will push metrics to the metric channel if the channel | |
42 | // is not paused | |
43 | func (ch *metricChan) Push(m metric) bool { | |
44 | if ch.IsPaused() { | |
45 | return false | |
46 | } | |
47 | ||
48 | select { | |
49 | case ch.ch <- m: | |
50 | return true | |
51 | default: | |
52 | return false | |
53 | } | |
54 | } |