This repository was archived by the owner on Apr 1, 2025. It is now read-only.
File tree Expand file tree Collapse file tree 1 file changed +15
-9
lines changed Expand file tree Collapse file tree 1 file changed +15
-9
lines changed Original file line number Diff line number Diff line change @@ -38,8 +38,8 @@ func NewMeter() Meter {
3838 return NilMeter {}
3939 }
4040 m := newStandardMeter ()
41- arbiter .Lock ()
42- defer arbiter .Unlock ()
41+ arbiter .lock . Lock ()
42+ defer arbiter .lock . Unlock ()
4343 arbiter .meters [m ] = struct {}{}
4444 if ! arbiter .started {
4545 arbiter .started = true
@@ -145,9 +145,12 @@ func newStandardMeter() *StandardMeter {
145145// Stop stops the meter, Mark() will be a no-op if you use it after being stopped.
146146func (m * StandardMeter ) Stop () {
147147 if atomic .CompareAndSwapUint32 (& m .stopped , 0 , 1 ) {
148- arbiter .Lock ()
148+ arbiter .lock . Lock ()
149149 delete (arbiter .meters , m )
150- arbiter .Unlock ()
150+ if len (arbiter .meters ) == 0 {
151+ arbiter .started = false
152+ }
153+ arbiter .lock .Unlock ()
151154 }
152155}
153156
@@ -224,7 +227,7 @@ func (m *StandardMeter) tick() {
224227// meterArbiter ticks meters every 5s from a single goroutine.
225228// meters are references in a set for future stopping.
226229type meterArbiter struct {
227- sync.RWMutex
230+ lock sync.RWMutex
228231 started bool
229232 meters map [* StandardMeter ]struct {}
230233 ticker * time.Ticker
@@ -237,15 +240,18 @@ func (ma *meterArbiter) tick() {
237240 for {
238241 select {
239242 case <- ma .ticker .C :
240- ma .tickMeters ()
243+ if ma .tickMeters () {
244+ return
245+ }
241246 }
242247 }
243248}
244249
245- func (ma * meterArbiter ) tickMeters () {
246- ma .RLock ()
247- defer ma .RUnlock ()
250+ func (ma * meterArbiter ) tickMeters () bool {
251+ ma .lock . RLock ()
252+ defer ma .lock . RUnlock ()
248253 for meter := range ma .meters {
249254 meter .tick ()
250255 }
256+ return ! ma .started
251257}
You can’t perform that action at this time.
0 commit comments