57 lines
1.1 KiB
Go
57 lines
1.1 KiB
Go
package vips
|
|
|
|
import "sync"
|
|
|
|
// RuntimeStats is a data structure to house a map of govips operation counts
|
|
type RuntimeStats struct {
|
|
OperationCounts map[string]int64
|
|
}
|
|
|
|
var (
|
|
operationCounter chan string
|
|
runtimeStats *RuntimeStats
|
|
statLock sync.RWMutex
|
|
)
|
|
|
|
func incOpCounter(op string) {
|
|
if operationCounter != nil {
|
|
operationCounter <- op
|
|
}
|
|
}
|
|
|
|
func collectStats() chan struct{} {
|
|
operationCounter = make(chan string, 100)
|
|
done := make(chan struct{})
|
|
exit := false
|
|
go func() {
|
|
for !exit {
|
|
select {
|
|
case op := <-operationCounter:
|
|
statLock.Lock()
|
|
runtimeStats.OperationCounts[op] = runtimeStats.OperationCounts[op] + 1
|
|
statLock.Unlock()
|
|
case <-done:
|
|
exit = true
|
|
break
|
|
}
|
|
}
|
|
}()
|
|
return done
|
|
}
|
|
|
|
// ReadRuntimeStats returns operation counts for govips
|
|
func ReadRuntimeStats(stats *RuntimeStats) {
|
|
statLock.RLock()
|
|
defer statLock.RUnlock()
|
|
stats.OperationCounts = make(map[string]int64)
|
|
for k, v := range runtimeStats.OperationCounts {
|
|
stats.OperationCounts[k] = v
|
|
}
|
|
}
|
|
|
|
func init() {
|
|
runtimeStats = &RuntimeStats{
|
|
OperationCounts: make(map[string]int64),
|
|
}
|
|
}
|