stats.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package core
  2. import (
  3. "sync"
  4. "v2ray.com/core/features/stats"
  5. )
  6. type syncStatManager struct {
  7. sync.RWMutex
  8. stats.Manager
  9. }
  10. func (*syncStatManager) Type() interface{} {
  11. return stats.ManagerType()
  12. }
  13. func (s *syncStatManager) Start() error {
  14. s.RLock()
  15. defer s.RUnlock()
  16. if s.Manager == nil {
  17. return nil
  18. }
  19. return s.Manager.Start()
  20. }
  21. func (s *syncStatManager) Close() error {
  22. s.RLock()
  23. defer s.RUnlock()
  24. if s.Manager == nil {
  25. return nil
  26. }
  27. return s.Manager.Close()
  28. }
  29. func (s *syncStatManager) RegisterCounter(name string) (stats.Counter, error) {
  30. s.RLock()
  31. defer s.RUnlock()
  32. if s.Manager == nil {
  33. return nil, newError("StatManager not set.")
  34. }
  35. return s.Manager.RegisterCounter(name)
  36. }
  37. func (s *syncStatManager) GetCounter(name string) stats.Counter {
  38. s.RLock()
  39. defer s.RUnlock()
  40. if s.Manager == nil {
  41. return nil
  42. }
  43. return s.Manager.GetCounter(name)
  44. }
  45. func (s *syncStatManager) Set(m stats.Manager) {
  46. if m == nil {
  47. return
  48. }
  49. s.Lock()
  50. defer s.Unlock()
  51. if s.Manager != nil {
  52. s.Manager.Close() // nolint: errcheck
  53. }
  54. s.Manager = m
  55. }