| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 | 
							- package core
 
- import (
 
- 	"sync"
 
- )
 
- type StatCounter interface {
 
- 	Value() int64
 
- 	Set(int64) int64
 
- 	Add(int64) int64
 
- }
 
- type StatManager interface {
 
- 	Feature
 
- 	RegisterCounter(string) (StatCounter, error)
 
- 	GetCounter(string) StatCounter
 
- }
 
- // GetOrRegisterStatCounter tries to get the StatCounter first. If not exist, it then tries to create a new counter.
 
- func GetOrRegisterStatCounter(m StatManager, name string) (StatCounter, error) {
 
- 	counter := m.GetCounter(name)
 
- 	if counter != nil {
 
- 		return counter, nil
 
- 	}
 
- 	return m.RegisterCounter(name)
 
- }
 
- type syncStatManager struct {
 
- 	sync.RWMutex
 
- 	StatManager
 
- }
 
- func (s *syncStatManager) Start() error {
 
- 	s.RLock()
 
- 	defer s.RUnlock()
 
- 	if s.StatManager == nil {
 
- 		return nil
 
- 	}
 
- 	return s.StatManager.Start()
 
- }
 
- func (s *syncStatManager) Close() error {
 
- 	s.RLock()
 
- 	defer s.RUnlock()
 
- 	if s.StatManager == nil {
 
- 		return nil
 
- 	}
 
- 	return s.StatManager.Close()
 
- }
 
- func (s *syncStatManager) RegisterCounter(name string) (StatCounter, error) {
 
- 	s.RLock()
 
- 	defer s.RUnlock()
 
- 	if s.StatManager == nil {
 
- 		return nil, newError("StatManager not set.")
 
- 	}
 
- 	return s.StatManager.RegisterCounter(name)
 
- }
 
- func (s *syncStatManager) GetCounter(name string) StatCounter {
 
- 	s.RLock()
 
- 	defer s.RUnlock()
 
- 	if s.StatManager == nil {
 
- 		return nil
 
- 	}
 
- 	return s.StatManager.GetCounter(name)
 
- }
 
- func (s *syncStatManager) Set(m StatManager) {
 
- 	if m == nil {
 
- 		return
 
- 	}
 
- 	s.Lock()
 
- 	defer s.Unlock()
 
- 	if s.StatManager != nil {
 
- 		s.StatManager.Close() // nolint: errcheck
 
- 	}
 
- 	s.StatManager = m
 
- }
 
 
  |