package csm import ( "sync/atomic" ) const ( runningEnum = iota pausedEnum ) var ( // MetricsChannelSize of metrics to hold in the channel MetricsChannelSize = 100 ) type metricChan struct { ch chan metric paused int64 } func newMetricChan(size int) metricChan { return metricChan{ ch: make(chan metric, size), } } func (ch *metricChan) Pause() { atomic.StoreInt64(&ch.paused, pausedEnum) } func (ch *metricChan) Continue() { atomic.StoreInt64(&ch.paused, runningEnum) } func (ch *metricChan) IsPaused() bool { v := atomic.LoadInt64(&ch.paused) return v == pausedEnum } // Push will push metrics to the metric channel if the channel // is not paused func (ch *metricChan) Push(m metric) bool { if ch.IsPaused() { return false } select { case ch.ch <- m: return true default: return false } }