lockstats.go 633 B

12345678910111213141516171819202122232425262728293031323334353637
  1. package sync
  2. import (
  3. "sort"
  4. "sync"
  5. "github.com/anacrolix/missinggo/perf"
  6. )
  7. var (
  8. // Stats on lock usage by call graph.
  9. lockStatsMu sync.Mutex
  10. lockStatsByStack map[lockStackKey]lockStats
  11. )
  12. type (
  13. lockStats = perf.Event
  14. lockStackKey = [32]uintptr
  15. lockCount = int64
  16. )
  17. type stackLockStats struct {
  18. stack lockStackKey
  19. lockStats
  20. }
  21. func sortedLockTimes() (ret []stackLockStats) {
  22. lockStatsMu.Lock()
  23. for stack, stats := range lockStatsByStack {
  24. ret = append(ret, stackLockStats{stack, stats})
  25. }
  26. lockStatsMu.Unlock()
  27. sort.Slice(ret, func(i, j int) bool {
  28. return ret[i].Total > ret[j].Total
  29. })
  30. return
  31. }