mirror of
				https://github.com/v2fly/v2ray-core.git
				synced 2025-11-03 19:29:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			88 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
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
 | 
						|
}
 |