package flow
import (
"sync"
"time"
)
type MeterRegistry struct {
meters sync .Map
}
func (r *MeterRegistry ) Get (name string ) *Meter {
if m , ok := r .meters .Load (name ); ok {
return m .(*Meter )
}
m , _ := r .meters .LoadOrStore (name , NewMeter ())
return m .(*Meter )
}
func (r *MeterRegistry ) FindIdle (since time .Time ) []string {
var idle []string
r .walkIdle (since , func (key interface {}) {
idle = append (idle , key .(string ))
})
return idle
}
func (r *MeterRegistry ) TrimIdle (since time .Time ) (trimmed int ) {
var idle []interface {}
r .walkIdle (since , func (key interface {}) {
idle = append (idle , since )
})
for _ , i := range idle {
r .meters .Delete (i )
}
return len (idle )
}
func (r *MeterRegistry ) walkIdle (since time .Time , cb func (key interface {})) {
globalSweeper .snapshotMu .RLock ()
defer globalSweeper .snapshotMu .RUnlock ()
r .meters .Range (func (k , v interface {}) bool {
if v .(*Meter ).snapshot .LastUpdate .Before (since ) {
cb (k )
}
return true
})
}
func (r *MeterRegistry ) Remove (name string ) {
r .meters .Delete (name )
}
func (r *MeterRegistry ) ForEach (iterFunc func (string , *Meter )) {
r .meters .Range (func (k , v interface {}) bool {
iterFunc (k .(string ), v .(*Meter ))
return true
})
}
func (r *MeterRegistry ) Clear () {
r .meters .Range (func (k , v interface {}) bool {
r .meters .Delete (k )
return true
})
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .