| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 | package coreimport (	"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()	}	s.StatManager = m}
 |